This is an automated email from the ASF dual-hosted git repository. geertjan pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-netbeans.git
The following commit(s) were added to refs/heads/master by this push: new 6aa3d33 [NETBEANS-238]: speeding up package lookup in jars by not listing the adjacent caches if those are empty. (#372) 6aa3d33 is described below commit 6aa3d333c1ffb8bfc669a5f4927a3321196d3610 Author: Jan Lahoda <lah...@gmail.com> AuthorDate: Sun Jan 28 20:32:23 2018 +0100 [NETBEANS-238]: speeding up package lookup in jars by not listing the adjacent caches if those are empty. (#372) The empty cache detection is based on the existence of the classes, which is no longer automatically created and is deleted by the indexer if empty. --- .../java/source/classpath/CacheClassPath.java | 2 +- .../java/source/indexing/JavaBinaryIndexer.java | 12 +- .../modules/java/source/indexing/JavaIndex.java | 5 + .../modules/java/source/parsing/Archive.java | 27 +++++ .../java/source/parsing/CacheFolderArchive.java | 122 +++++++++++++++++++++ .../source/parsing/CachingArchiveProvider.java | 8 +- .../java/source/parsing/WriteBackTransaction.java | 2 +- .../java/source/nbjavac/parsing/TreeLoader.java | 2 +- 8 files changed, 175 insertions(+), 5 deletions(-) diff --git a/java.source.base/src/org/netbeans/modules/java/source/classpath/CacheClassPath.java b/java.source.base/src/org/netbeans/modules/java/source/classpath/CacheClassPath.java index 58d7b3f..4536486 100644 --- a/java.source.base/src/org/netbeans/modules/java/source/classpath/CacheClassPath.java +++ b/java.source.base/src/org/netbeans/modules/java/source/classpath/CacheClassPath.java @@ -245,7 +245,7 @@ public class CacheClassPath implements ClassPathImplementation, PropertyChangeLi if (result == null) { result = EMPTY; try { - File sigs = JavaIndex.getClassFolder(originalRoot,false,scan); + File sigs = JavaIndex.getClassFolder(originalRoot,false,false); URL orl = FileUtil.urlForArchiveOrDir(sigs); if (orl != null) { result = new URL[] {orl}; diff --git a/java.source.base/src/org/netbeans/modules/java/source/indexing/JavaBinaryIndexer.java b/java.source.base/src/org/netbeans/modules/java/source/indexing/JavaBinaryIndexer.java index 7875bda..1629da4 100644 --- a/java.source.base/src/org/netbeans/modules/java/source/indexing/JavaBinaryIndexer.java +++ b/java.source.base/src/org/netbeans/modules/java/source/indexing/JavaBinaryIndexer.java @@ -120,7 +120,7 @@ public class JavaBinaryIndexer extends BinaryIndexer { } private static void deleteSigFiles(final URL root, final List<? extends ElementHandle<TypeElement>> toRemove) throws IOException { - File cacheFolder = JavaIndex.getClassFolder(root); + File cacheFolder = JavaIndex.getClassFolder(root, false, false); if (cacheFolder.exists()) { if (toRemove.size() > CLEAN_ALL_LIMIT) { //Todo: do as SlowIOTask @@ -287,11 +287,21 @@ public class JavaBinaryIndexer extends BinaryIndexer { } else { txCtx.commit(); } + File classes = JavaIndex.getClassFolder(context.getRootURI(), false, false); + if (classes.exists() && isEmpty(classes)) { + classes.delete(); + } } catch (IOException ex) { Exceptions.printStackTrace(ex); } } + private boolean isEmpty(File dir) { + String[] content = dir.list(); + + return content == null || content.length == 0; + } + @MimeRegistration(mimeType="", service=BinaryIndexerFactory.class) public static Factory register() { return NoJavacHelper.hasWorkingJavac() ? new Factory() : null; diff --git a/java.source.base/src/org/netbeans/modules/java/source/indexing/JavaIndex.java b/java.source.base/src/org/netbeans/modules/java/source/indexing/JavaIndex.java index 62a2537..d44b77b 100644 --- a/java.source.base/src/org/netbeans/modules/java/source/indexing/JavaIndex.java +++ b/java.source.base/src/org/netbeans/modules/java/source/indexing/JavaIndex.java @@ -366,4 +366,9 @@ public final class JavaIndex { } } } + + public static boolean isCacheFolder(File dir) { + File cacheFolder = FileUtil.toFile(CacheFolder.getCacheFolder()); + return dir.toURI().toASCIIString().startsWith(cacheFolder.toURI().toASCIIString()); + } } diff --git a/java.source.base/src/org/netbeans/modules/java/source/parsing/Archive.java b/java.source.base/src/org/netbeans/modules/java/source/parsing/Archive.java index a8fc9fa..47b4983 100644 --- a/java.source.base/src/org/netbeans/modules/java/source/parsing/Archive.java +++ b/java.source.base/src/org/netbeans/modules/java/source/parsing/Archive.java @@ -20,6 +20,7 @@ package org.netbeans.modules.java.source.parsing; import java.io.IOException; +import java.util.Collections; import java.util.Set; import javax.tools.JavaFileObject; import org.netbeans.api.annotations.common.NonNull; @@ -69,4 +70,30 @@ public interface Archive { * @return true if the {@link Archive} is supports multiple releases. */ public boolean isMultiRelease(); + + public static Archive EMPTY = new Archive() { + @Override + public Iterable<JavaFileObject> getFiles(String folderName, ClassPath.Entry entry, Set<JavaFileObject.Kind> kinds, JavaFileFilterImplementation filter, boolean recursive) throws IOException { + return Collections.emptyList(); + } + + @Override + public JavaFileObject create(String relativeName, JavaFileFilterImplementation filter) throws UnsupportedOperationException { + return null; + } + + @Override + public void clear() { + } + + @Override + public JavaFileObject getFile(String name) throws IOException { + return null; + } + + @Override + public boolean isMultiRelease() { + return false; + } + }; } diff --git a/java.source.base/src/org/netbeans/modules/java/source/parsing/CacheFolderArchive.java b/java.source.base/src/org/netbeans/modules/java/source/parsing/CacheFolderArchive.java new file mode 100644 index 0000000..fed6986 --- /dev/null +++ b/java.source.base/src/org/netbeans/modules/java/source/parsing/CacheFolderArchive.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.netbeans.modules.java.source.parsing; + +import java.io.File; +import java.io.IOException; +import java.util.Set; + +import javax.tools.JavaFileObject; +import javax.tools.JavaFileObject.Kind; + +import org.netbeans.api.annotations.common.NonNull; +import org.netbeans.api.java.classpath.ClassPath.Entry; +import org.netbeans.modules.java.preprocessorbridge.spi.JavaFileFilterImplementation; +import org.openide.filesystems.FileAttributeEvent; +import org.openide.filesystems.FileChangeListener; +import org.openide.filesystems.FileEvent; +import org.openide.filesystems.FileRenameEvent; +import org.openide.filesystems.FileUtil; +import org.openide.util.Parameters; + +/** + * + * @author Tomas Zezula + */ +class CacheFolderArchive implements Archive, FileChangeListener { + + private volatile Archive delegate; + private final File cache; + + public CacheFolderArchive( + @NonNull File cache) { + Parameters.notNull("cache", cache); //NOI18N + this.cache = cache; + if (cache.isDirectory()) { + delegate = new FolderArchive(cache); + } else { + FileUtil.addFileChangeListener(this, cache); + delegate = Archive.EMPTY; + } + } + + @Override + public JavaFileObject getFile(String name) throws IOException { + return delegate.getFile(name); + } + + @Override + public void clear() { + delegate.clear(); + } + + @Override + public JavaFileObject create(String relativeName, JavaFileFilterImplementation filter) throws UnsupportedOperationException { + return delegate.create(relativeName, filter); + } + + @Override + public boolean isMultiRelease() { + return delegate.isMultiRelease(); + } + + @Override + public Iterable<JavaFileObject> getFiles(String folderName, Entry entry, Set<Kind> kinds, JavaFileFilterImplementation filter, boolean recursive) throws IOException { + return delegate.getFiles(folderName, entry, kinds, filter, recursive); + } + + private void update() { + if (cache.isDirectory()) { + delegate = new FolderArchive(cache); + FileUtil.removeFileChangeListener(this, cache); + } + } + + @Override + public void fileFolderCreated(FileEvent fe) { + update(); + } + + @Override + public void fileDataCreated(FileEvent fe) { + update(); + } + + @Override + public void fileChanged(FileEvent fe) { + update(); + } + + @Override + public void fileDeleted(FileEvent fe) { + update(); + } + + @Override + public void fileRenamed(FileRenameEvent fe) { + update(); + } + + @Override + public void fileAttributeChanged(FileAttributeEvent fe) { + update(); + } + +} diff --git a/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchiveProvider.java b/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchiveProvider.java index 06c7465..56b9c1c 100644 --- a/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchiveProvider.java +++ b/java.source.base/src/org/netbeans/modules/java/source/parsing/CachingArchiveProvider.java @@ -27,17 +27,21 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; + import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.java.classpath.ClassPath; import org.netbeans.api.java.platform.JavaPlatform; import org.netbeans.api.java.platform.JavaPlatformManager; +import org.netbeans.modules.java.source.indexing.JavaIndex; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.filesystems.URLMapper; @@ -241,7 +245,9 @@ public final class CachingArchiveProvider { String protocol = root.first().getProtocol(); if ("file".equals(protocol)) { //NOI18N File f = BaseUtilities.toFile(root.second()); - if (f.isDirectory()) { + if (JavaIndex.isCacheFolder(f)) { + return Pair.<Archive,URI>of(new CacheFolderArchive(f), null); + } else if (f.isDirectory()) { return Pair.<Archive,URI>of(new FolderArchive (f), null); } else { diff --git a/java.source.base/src/org/netbeans/modules/java/source/parsing/WriteBackTransaction.java b/java.source.base/src/org/netbeans/modules/java/source/parsing/WriteBackTransaction.java index bf135f7..09c36cd 100644 --- a/java.source.base/src/org/netbeans/modules/java/source/parsing/WriteBackTransaction.java +++ b/java.source.base/src/org/netbeans/modules/java/source/parsing/WriteBackTransaction.java @@ -72,7 +72,7 @@ class WriteBackTransaction extends FileManagerTransaction { super(true); this.root = root; try { - this.classesFolder = BaseUtilities.toURI(JavaIndex.getClassFolder(root)).toURL(); + this.classesFolder = BaseUtilities.toURI(JavaIndex.getClassFolder(root, false, false)).toURL(); } catch (IOException ioe) { throw new RuntimeException(ioe); } diff --git a/java.source.nbjavac/src/org/netbeans/modules/java/source/nbjavac/parsing/TreeLoader.java b/java.source.nbjavac/src/org/netbeans/modules/java/source/nbjavac/parsing/TreeLoader.java index c6b7849..9067e40 100644 --- a/java.source.nbjavac/src/org/netbeans/modules/java/source/nbjavac/parsing/TreeLoader.java +++ b/java.source.nbjavac/src/org/netbeans/modules/java/source/nbjavac/parsing/TreeLoader.java @@ -391,7 +391,7 @@ public class TreeLoader extends LazyTreeLoader { } int index = surl.lastIndexOf(FileObjects.convertPackage2Folder(binaryName)); if (index > 0) { - return JavaIndex.getClassFolder(new URL(surl.substring(0, index))); + return JavaIndex.getClassFolder(new URL(surl.substring(0, index)), false, false); } else { LOGGER.log( Level.INFO, -- To stop receiving notification emails like this one, please contact geert...@apache.org. --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists