package org.netbeans.gradle.project.query; import java.io.File; import java.net.URL; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.netbeans.api.java.queries.JavadocForBinaryQuery; import org.netbeans.spi.java.queries.JavadocForBinaryQueryImplementation; import org.openide.filesystems.FileUtil; public abstract class AbstractJavadocForBinaryQuery implements JavadocForBinaryQueryImplementation { // This cache cannot shrink because JavadocForBinaryQueryImplementation // requires that we return the exact same object when the same URL is // querried. This is a very limiting constraint but I don't want to risk to // violate the constraint. private final ConcurrentMap<File, JavadocForBinaryQuery.Result> cache; public AbstractJavadocForBinaryQuery() { this.cache = new ConcurrentHashMap<>(); } protected abstract JavadocForBinaryQuery.Result tryFindJavadoc(File binaryRoot); @Override public JavadocForBinaryQuery.Result findJavadoc(URL binaryRoot) { File binaryRootFile = FileUtil.archiveOrDirForURL(binaryRoot); if (binaryRootFile == null) { return null; } JavadocForBinaryQuery.Result result = cache.get(binaryRootFile); if (result != null) { return result; } result = tryFindJavadoc(binaryRootFile); if (result == null) { return null; } JavadocForBinaryQuery.Result oldResult = cache.putIfAbsent(binaryRootFile, result); return oldResult != null ? oldResult : result; } }