package org.distributeme.generator;
import org.distributeme.core.lifecycle.ServiceAdapter;
import javax.annotation.processing.Filer;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;
import javax.tools.JavaFileObject;
import java.io.IOException;
import java.io.PrintWriter;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Generator for RMI based remote interface.
*
* @author lrosenberg
* @version $Id: $Id
*/
public class RemoteInterfaceGenerator extends AbstractGenerator implements Generator{
/**
* <p>Constructor for RemoteInterfaceGenerator.</p>
*
* @param environment a {@link javax.annotation.processing.ProcessingEnvironment} object.
*/
public RemoteInterfaceGenerator(ProcessingEnvironment environment) {
super(environment);
}
/** {@inheritDoc} */
@Override
public void generate(TypeElement type, Filer filer, Map<String,String> options) throws IOException{
JavaFileObject sourceFile = filer.createSourceFile(getPackageName(type)+"."+getRemoteInterfaceName(type));
PrintWriter writer = new PrintWriter(sourceFile.openWriter());
setWriter(writer);
writePackage(type);
writeAnalyzerComments(type);
emptyline();
writeImport(Remote.class);
writeImport(RemoteException.class);
writeImport(ServiceAdapter.class);
writeImport(List.class);
writeImport(Map.class);
emptyline();
writeString("public interface "+getRemoteInterfaceName(type)+" extends Remote, ServiceAdapter{");
increaseIdent();
Collection<? extends ExecutableElement> methods = getAllDeclaredMethods(type);
for (ExecutableElement method : methods){
String methodDecl = getInterfaceMethodDeclaration(method, true);
if (method.getThrownTypes().size()>0){
StringBuilder exceptions = new StringBuilder();
for (TypeMirror rt : method.getThrownTypes()){
if (exceptions.length()>0)
exceptions.append(", ");
exceptions.append(rt.toString());
}
methodDecl += " throws "+exceptions +", RemoteException";
}else{
methodDecl +=" throws RemoteException";
}
writeStatement(methodDecl);
emptyline();
}
closeBlock();
writer.flush();
writer.close();
}
}