package com.google.jstestdriver.idea.assertFramework.jstd;
import com.google.jstestdriver.idea.assertFramework.jstd.jsSrc.JstdDefaultAssertionFrameworkSrcMarker;
import com.google.jstestdriver.idea.util.VfsUtils;
import com.intellij.lang.javascript.library.JSLibraryManager;
import com.intellij.lang.javascript.library.JSLibraryMappings;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.libraries.scripting.ScriptingLibraryModel;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class JsAssertFrameworkLibraryManager {
public static final String LIBRARY_NAME = "JsTestDriver Assertion Framework";
private JsAssertFrameworkLibraryManager() {}
public static ScriptingLibraryModel createScriptingLibraryModelAndAssociateIt(final @NotNull Project project,
final VirtualFile rootForAssociation) {
return ApplicationManager.getApplication().runWriteAction(new Computable<ScriptingLibraryModel>() {
@Override
public ScriptingLibraryModel compute() {
JSLibraryManager libraryManager = ServiceManager.getService(project, JSLibraryManager.class);
JSLibraryMappings mappings = ServiceManager.getService(project, JSLibraryMappings.class);
ScriptingLibraryModel scriptingLibraryModel = libraryManager.getLibraryByName(LIBRARY_NAME);
if (scriptingLibraryModel != null) {
libraryManager.removeLibrary(scriptingLibraryModel);
mappings.disassociate(rootForAssociation, LIBRARY_NAME);
libraryManager.commitChanges();
System.out.println("Removing '" + LIBRARY_NAME + "' library and disassociating it from " + rootForAssociation);
}
VirtualFile[] arrayVirtualFiles = getAdditionalSourceFiles();
scriptingLibraryModel = libraryManager.createLibrary(
LIBRARY_NAME,
arrayVirtualFiles,
VirtualFile.EMPTY_ARRAY,
ArrayUtil.EMPTY_STRING_ARRAY
);
libraryManager.commitChanges();
mappings.associate(rootForAssociation, LIBRARY_NAME);
System.out.println("Library '" + LIBRARY_NAME + "' has been associated to " + rootForAssociation);
return scriptingLibraryModel;
}
});
}
@NotNull
public static VirtualFile[] getAdditionalSourceFiles() {
List<VirtualFile> files = getAdditionalSourceFilesAsList();
return VfsUtil.toVirtualFileArray(files);
}
@NotNull
public static List<VirtualFile> getAdditionalSourceFilesAsList() {
return VfsUtils.findVirtualFilesByResourceNames(JstdDefaultAssertionFrameworkSrcMarker.class, new String[] {
"Asserts.js", "TestCase.js"
});
}
}