Packing mock library to jar to avoid VFS magic.

This commit is contained in:
Evgeny Gerashchenko
2013-08-20 16:19:11 +04:00
committed by Pavel V. Talanov
parent dd4939a5ec
commit 42a6543c25
2 changed files with 73 additions and 91 deletions
@@ -1,35 +1,13 @@
package org.jetbrains.jet.plugin;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.util.ThrowableComputable;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileVisitor;
import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.cli.common.ExitCode;
import org.jetbrains.jet.cli.jvm.K2JVMCompiler;
import org.jetbrains.jet.utils.ExceptionUtils;
import org.jetbrains.jet.utils.PathUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
public class JdkAndMockLibraryProjectDescriptor extends JetLightProjectDescriptor {
private final String sourcesPath;
@@ -42,76 +20,15 @@ public class JdkAndMockLibraryProjectDescriptor extends JetLightProjectDescripto
@Override
public void configureModule(Module module, ModifiableRootModel model, ContentEntry contentEntry) {
try {
File compiledDir = compileTestLibrary(sourcesPath);
File libraryJar = MockLibraryUtil.compileLibraryToJar(sourcesPath);
String jarUrl = "jar://" + FileUtilRt.toSystemIndependentName(libraryJar.getAbsolutePath()) + "!/";
final VirtualFile baseDir = module.getProject().getBaseDir();
assertNotNull(baseDir);
VirtualFile libraryDir = ApplicationManager.getApplication().runWriteAction(new ThrowableComputable<VirtualFile, IOException>() {
@Override
public VirtualFile compute() throws IOException {
VirtualFile libraryDir = baseDir.createChildDirectory(this, "lib");
baseDir.createChildDirectory(this, "src");
return libraryDir;
}
});
VirtualFile testDataDir = LocalFileSystem.getInstance().findFileByPath(sourcesPath).getParent();
assertNotNull(testDataDir);
VfsUtilCore.visitChildrenRecursively(testDataDir, new VirtualFileVisitor() {
@Override
public boolean visitFile(@NotNull VirtualFile file) {
file.getChildren();
file.refresh(false, true);
return true;
}
});
VirtualFile librarySourceDir = LocalFileSystem.getInstance().findFileByPath(sourcesPath);
assertNotNull(librarySourceDir);
FileUtil.copyDir(compiledDir, new File(libraryDir.getPath()));
((NewVirtualFile)baseDir).markDirtyRecursively();
baseDir.refresh(false, true);
Library.ModifiableModel libraryModel = model.getModuleLibraryTable().getModifiableModel().createLibrary("myKotlinLib").getModifiableModel();
libraryModel.addRoot(libraryDir, OrderRootType.CLASSES);
if (withSources) {
libraryModel.addRoot(librarySourceDir, OrderRootType.SOURCES);
}
libraryModel.commit();
}
catch (IOException e) {
throw new AssertionError(e);
}
}
private static File compileTestLibrary(String sourcesPath) {
try {
File compiledDir = JetTestUtils.tmpDir("dummylib");
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
File kotlinCompilerJar = new File(PathUtil.getKotlinPathsForDistDirectory().getLibPath(), "kotlin-compiler.jar");
URLClassLoader classLoader = new URLClassLoader(new URL[] {kotlinCompilerJar.toURI().toURL()}, Object.class.getClassLoader());
Class<?> compilerClass = classLoader.loadClass(K2JVMCompiler.class.getName());
Object compilerObject = compilerClass.newInstance();
Method execMethod = compilerClass.getMethod("exec", PrintStream.class, String[].class);
//noinspection IOResourceOpenedButNotSafelyClosed
Enum<?> invocationResult = (Enum<?>) execMethod
.invoke(compilerObject, new PrintStream(outStream),
new String[] {"-src", sourcesPath, "-output", compiledDir.getAbsolutePath()});
assertEquals(new String(outStream.toByteArray()), ExitCode.OK.name(), invocationResult.name());
return compiledDir;
}
catch (Throwable e) {
throw ExceptionUtils.rethrow(e);
Library.ModifiableModel libraryModel = model.getModuleLibraryTable().getModifiableModel().createLibrary("myKotlinLib").getModifiableModel();
libraryModel.addRoot(jarUrl, OrderRootType.CLASSES);
if (withSources) {
libraryModel.addRoot(jarUrl + "src/", OrderRootType.SOURCES);
}
libraryModel.commit();
}
@@ -0,0 +1,65 @@
package org.jetbrains.jet.plugin;
import com.intellij.util.io.ZipUtil;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.cli.common.ExitCode;
import org.jetbrains.jet.cli.jvm.K2JVMCompiler;
import org.jetbrains.jet.utils.ExceptionUtils;
import org.jetbrains.jet.utils.PathUtil;
import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.zip.ZipOutputStream;
import static junit.framework.Assert.assertEquals;
public class MockLibraryUtil {
public static File compileLibraryToJar(String sourcesPath) {
try {
File contentDir = JetTestUtils.tmpDir("lib-content");
File classesDir = new File(contentDir, "classes");
compile(sourcesPath, classesDir);
File jarFile = new File(contentDir, "library.jar");
ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(jarFile));
ZipUtil.addDirToZipRecursively(zip, jarFile, classesDir, "", null, null);
ZipUtil.addDirToZipRecursively(zip, jarFile, new File(sourcesPath), "src", null, null);
zip.close();
return jarFile;
}
catch (IOException e) {
throw ExceptionUtils.rethrow(e);
}
}
private static void compile(String sourcesPath, File outDir) {
try {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
File kotlinCompilerJar = new File(PathUtil.getKotlinPathsForDistDirectory().getLibPath(), "kotlin-compiler.jar");
URLClassLoader classLoader = new URLClassLoader(new URL[] {kotlinCompilerJar.toURI().toURL()}, Object.class.getClassLoader());
Class<?> compilerClass = classLoader.loadClass(K2JVMCompiler.class.getName());
Object compilerObject = compilerClass.newInstance();
Method execMethod = compilerClass.getMethod("exec", PrintStream.class, String[].class);
//noinspection IOResourceOpenedButNotSafelyClosed
Enum<?> invocationResult = (Enum<?>) execMethod
.invoke(compilerObject, new PrintStream(outStream),
new String[] {"-src", sourcesPath, "-output", outDir.getAbsolutePath()});
assertEquals(new String(outStream.toByteArray()), ExitCode.OK.name(), invocationResult.name());
}
catch (Throwable e) {
throw ExceptionUtils.rethrow(e);
}
}
private MockLibraryUtil() {
}
}