package org.netbeans.gradle.project.util;
import java.io.File;
import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.model.util.ConstructableWeakRef;
import org.netbeans.gradle.model.util.NbSupplier5;
import org.openide.filesystems.FileUtil;
public final class UrlFactory {
private static final NbSupplier5<UrlFactory> DEFAULT_REF = new ConstructableWeakRef<>(new NbSupplier5<UrlFactory>() {
@Override
public UrlFactory get() {
return new UrlFactory();
}
});
private final NbFunction<? super File, ? extends URL> urlCreator;
private final ConcurrentMap<File, URL> cache;
public UrlFactory() {
this(new NbFunction<File, URL>() {
@Override
public URL apply(File entry) {
return FileUtil.urlForArchiveOrDir(entry);
}
});
}
public UrlFactory(NbFunction<? super File, ? extends URL> urlCreator) {
ExceptionHelper.checkNotNullArgument(urlCreator, "urlCreator");
this.urlCreator = urlCreator;
this.cache = new ConcurrentHashMap<>(256);
}
public static URL urlForArchiveOrDir(File entry) {
return getDefaultArchiveOrDirFactory().toUrl(entry);
}
public static UrlFactory getDefaultArchiveOrDirFactory() {
return DEFAULT_REF.get();
}
public URL toUrl(File entry) {
URL result = cache.get(entry);
if (result != null) {
return result;
}
result = urlCreator.apply(entry);
if (result == null) {
return null;
}
URL prevValue = cache.putIfAbsent(entry, result);
return prevValue != null ? prevValue : result;
}
}