package knorxx.framework.generator;
import com.google.common.base.Optional;
import com.google.common.io.ByteStreams;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import knorxx.framework.generator.util.JavaIdentifierUtils;
/**
*
* @author sj
*/
public abstract class JavaFile<T> {
private final Class<T> javaClass;
protected JavaFile(Class<T> javaClass) {
this.javaClass = javaClass;
}
protected JavaFile(Class<T> javaClass, GenerationRoots generationRoots) {
this.javaClass = javaClass;
}
public Class<T> getJavaClass() {
return javaClass;
}
public String getJavaClassName() {
return javaClass.getName();
}
public String getJavaClassSimpleName() {
return javaClass.getSimpleName();
}
public boolean isInnerClass() {
return JavaIdentifierUtils.isInnerClass(getJavaClassName());
}
public abstract Optional<InputStream> getSourceInputStream();
public abstract InputStream getClassInputStream();
public byte[] readClass() throws IOException {
return ByteStreams.toByteArray(getClassInputStream());
}
public abstract JavaFile getInnerClass(String innerClassSimpleName, ClassLoader classLoader);
protected Optional<InputStream> getInputStream(File file) {
try {
return Optional.<InputStream>of(new FileInputStream(file));
} catch (FileNotFoundException ex) {
// should not happen, we checked the existence in the constructor
}
return Optional.<InputStream>absent();
}
protected Optional<InputStream> getInputStream(URL url) {
try {
return Optional.<InputStream>of(url.openStream());
} catch (IOException ex) {
// should not happen, we checked the existence in the constructor
}
return Optional.<InputStream>absent();
}
protected Class loadInnerClass(String innerClassSimpleName, ClassLoader classLoader) {
String innerClassName = getJavaClassName() + "$" + innerClassSimpleName;
try {
Class innerClass = classLoader.loadClass(innerClassName);
return innerClass;
} catch (ClassNotFoundException ex) {
throw new IllegalStateException("Can't load the class '" + innerClassName + "' via the given ClassLoader!", ex);
}
}
}