package rtt.annotation.editor.data.asm;
import java.io.IOException;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import rtt.annotation.editor.data.ModelWriter;
import rtt.annotation.editor.data.ModelReader;
import rtt.annotation.editor.data.NameResolver;
import rtt.annotation.editor.model.ClassModel;
import rtt.annotation.editor.model.ClassModelFactory;
public class ASMClassModelManager implements ModelReader, ModelWriter {
public static final NameResolver RESOLVER = NameResolver.create(".");
@Override
public ClassModel importModel(URI input) throws IOException {
ClassModel model = ClassModelFactory.getFactory().createClassModel();
walkFileTree(input, new ImportModelFileWalker(model));
RESOLVER.resolveModel(model);
return model;
}
@Override
public void exportModel(ClassModel model, URI output) throws IOException {
walkFileTree(output, new ExportModelFileWalker(model));
}
private void walkFileTree(URI file, FileVisitor<? super Path> fileWalker) throws IOException {
Map<String, String> env = new HashMap<>();
env.put("create", "false");
URI zipUri = URI.create("jar:" + file);
try (FileSystem zipFs = FileSystems.newFileSystem(zipUri, env)) {
Files.walkFileTree(zipFs.getPath("/"), fileWalker);
}
}
}