package org.jboss.mockgenerator;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Formatter;
public class JavaSource {
protected final File directory;
protected final String mockPackage;
protected String mockClass;
protected final StringWriter output;
public JavaSource(File directory, String mockClassName) {
this.directory = directory;
// calculate mock class name
int indexOfDot = mockClassName.lastIndexOf('.');
if(indexOfDot>=0){
this.mockClass=mockClassName.substring(indexOfDot+1);
this.mockPackage = mockClassName.substring(0, indexOfDot);
} else {
this.mockClass=mockClassName;
this.mockPackage = "";
}
output = new StringWriter(2048);
}
public void writeClassFile() throws IOException {
File packageDirectory = new File(directory,mockPackage.replace('.', File.separatorChar));
packageDirectory.mkdirs();
File sourceFile = new File(packageDirectory,mockClass+".java");
if(sourceFile.exists()){
// It has would better to check last modification time
sourceFile.delete();
}
sourceFile.createNewFile();
Writer writer = new BufferedWriter(new FileWriter(sourceFile));
writer.write(output.toString());
writer.flush();
writer.close();
}
static String classToString(Class<?> returnType) {
return classToString(returnType, false);
}
static String classToString(Class<?> returnType, boolean varargs) {
if(returnType.isArray()){
return classToString(returnType.getComponentType())+(varargs?"...":"[]");
}
return returnType.getName().replace('$', '.');
}
static String boxingClassName(Class<?> clazz){
if(clazz.isPrimitive()){
if(boolean.class.equals(clazz)){
return Boolean.class.getSimpleName();
} else if(int.class.equals(clazz)){
return Integer.class.getSimpleName();
} else if(char.class.equals(clazz)){
return Character.class.getSimpleName();
} else if(short.class.equals(clazz)){
return Short.class.getSimpleName();
} else if(byte.class.equals(clazz)){
return Byte.class.getSimpleName();
} else if(long.class.equals(clazz)){
return Long.class.getSimpleName();
} else if(float.class.equals(clazz)){
return Float.class.getSimpleName();
} else if(double.class.equals(clazz)){
return Double.class.getSimpleName();
}
}
return classToString(clazz);
}
static Class<?>[] getMethodParemeters(Method method){
Type[] parameterTypes = method.getGenericParameterTypes();
Class<?>[] parameters = new Class<?>[parameterTypes.length];
for (int i = 0; i < parameterTypes.length; i++) {
Type type = parameterTypes[i];
}
return parameters;
}
public void sprintf(String format, Object...args) {
Formatter formatter = new Formatter(output);
formatter.format(format, args);
formatter.flush();
}
public void write(String str){
output.write(str);
}
@Override
public String toString() {
return output.toString();
}
}