io.vertx.core.impl.verticle.MemoryFileManager Maven / Gradle / Ivy
/*
* Copyright (c) 2011-2014 The original author or authors
* ------------------------------------------------------
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* The Apache License v2.0 is available at
* http://www.opensource.org/licenses/apache2.0.php
*
* You may elect to redistribute this code under either of these licenses.
*/
package io.vertx.core.impl.verticle;
import javax.tools.FileObject;
import javax.tools.ForwardingJavaFileManager;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardLocation;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* Java in-memory file manager used by {@link CompilingClassLoader} to handle
* compiled classes
*
* @author Janne Hietamäki
*/
public class MemoryFileManager extends ForwardingJavaFileManager {
private final Map compiledClasses = new HashMap<>();
private final PackageHelper helper;
public MemoryFileManager(ClassLoader classLoader, JavaFileManager fileManager) {
super(fileManager);
helper = new PackageHelper(classLoader);
}
@Override
public JavaFileObject getJavaFileForOutput(Location location, final String className,
JavaFileObject.Kind kind, FileObject sibling) throws IOException {
try {
return new SimpleJavaFileObject(new URI(""), kind) {
public OutputStream openOutputStream() throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
compiledClasses.put(className, outputStream);
return outputStream;
}
};
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
public byte[] getCompiledClass(String name) {
ByteArrayOutputStream bytes = compiledClasses.get(name);
if (bytes == null) {
return null;
}
return bytes.toByteArray();
}
@Override
public String inferBinaryName(Location location, JavaFileObject file) {
if (file instanceof CustomJavaFileObject) {
return ((CustomJavaFileObject) file).binaryName();
} else {
return super.inferBinaryName(location, file);
}
}
@Override
public Iterable list(Location location, String packageName, Set kinds,
boolean recurse) throws IOException {
if (location == StandardLocation.CLASS_PATH && kinds.contains(JavaFileObject.Kind.CLASS)) {
return helper.find(packageName);
}
return super.list(location, packageName, kinds, recurse);
}
}