package com.oracle.truffle.api.source;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.URI;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Set;
import java.util.function.Function;
import com.oracle.truffle.api.TruffleFile;
import com.oracle.truffle.api.impl.Accessor;
import com.oracle.truffle.api.source.Source.SourceBuilder;
final class SourceAccessor extends Accessor {
static final SourceAccessor ACCESSOR = new SourceAccessor();
static final LanguageSupport LANGUAGE = ACCESSOR.languageSupport();
private SourceAccessor() {
}
public static void load() {
}
static String detectMimeType(TruffleFile file, Set<String> validMimeTypes) {
return ACCESSOR.languageSupport().detectMimeType(file, validMimeTypes);
}
static Charset detectEncoding(TruffleFile file, String mimeType) {
return ACCESSOR.languageSupport().detectEncoding(file, mimeType);
}
static TruffleFile getTruffleFile(URI uri, Object fileSystemContext) {
return ACCESSOR.languageSupport().getTruffleFile(fileSystemContext, uri);
}
static TruffleFile getTruffleFile(String path, Object fileSystemContext) {
return ACCESSOR.languageSupport().getTruffleFile(path, fileSystemContext);
}
static boolean hasAllAccess(Object fileSystemContext) {
return ACCESSOR.languageSupport().hasAllAccess(fileSystemContext);
}
static void onSourceCreated(Source source) {
ACCESSOR.engineSupport().onSourceCreated(source);
}
static String getReinitializedPath(TruffleFile truffleFile) {
return ACCESSOR.engineSupport().getReinitializedPath(truffleFile);
}
static URI getReinitializedURI(TruffleFile truffleFile) {
return ACCESSOR.engineSupport().getReinitializedURI(truffleFile);
}
static final class SourceSupportImpl extends Accessor.SourceSupport {
@Override
public Source copySource(Source source) {
Source copy = source.copy();
copy.cachedPolyglotSource = source.cachedPolyglotSource;
return copy;
}
@Override
public Object getSourceIdentifier(Source source) {
return source.getSourceId();
}
@Override
public org.graalvm.polyglot.Source getOrCreatePolyglotSource(Source source,
Function<Source, org.graalvm.polyglot.Source> createSource) {
WeakReference<org.graalvm.polyglot.Source> ref = source.cachedPolyglotSource;
org.graalvm.polyglot.Source polyglotSource;
if (ref == null) {
polyglotSource = null;
} else {
polyglotSource = ref.get();
}
if (polyglotSource == null) {
polyglotSource = createSource.apply(source);
source.cachedPolyglotSource = new WeakReference<>(polyglotSource);
}
assert polyglotSource != null;
return polyglotSource;
}
@Override
public String findMimeType(URL url, Object fileSystemContext) throws IOException {
return Source.findMimeType(url, url.openConnection(), null, fileSystemContext);
}
@Override
public SourceBuilder newBuilder(String language, File origin) {
return Source.newBuilder(language, origin);
}
@Override
public void setFileSystemContext(SourceBuilder builder, Object fileSystemContext) {
builder.fileSystemContext(fileSystemContext);
}
@Override
public void invalidateAfterPreinitialiation(Source source) {
((SourceImpl) source).key.invalidateAfterPreinitialiation();
}
@Override
public void mergeLoadedSources(Source[] sources) {
for (Source s : sources) {
if (s instanceof SourceImpl) {
Source.SOURCES.add(((SourceImpl) s));
}
}
}
}
}