blob: bc51aad38b9db644360fb7c850b5261704ee2c72 [file] [log] [blame]
/* RmicCompiler.java -- RMI stub generator for java.rmi.*
Copyright (C) 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
*/
package gnu.classpath.tools.rmi.rmic;
import java.lang.reflect.Method;
import java.util.Iterator;
import gnu.classpath.tools.AbstractMethodGenerator;
import gnu.classpath.tools.giop.grmic.GiopRmicCompiler;
/**
* RMI stub source code generator, required to support java.rmi.*
*
* @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
*/
public class RmicCompiler extends GiopRmicCompiler
{
/**
* If true, the zero size object array is declared in the stub to reduce
* garbage generation.
*/
public boolean addZeroSizeObjecArray;
/**
* Generate a RMI stub.
*
* @return the string, containing the text of the generated stub.
*/
public String generateStub()
{
String template = getResource("Stub_12.jav");
// Generate methods.
StringBuffer b = new StringBuffer();
Iterator iter = methods.iterator();
while (iter.hasNext())
{
RmiMethodGenerator m = (RmiMethodGenerator) iter.next();
b.append(m.generateStubMethod());
}
vars.put("#stub_methods", b.toString());
vars.put("#imports", getImportStatements());
vars.put("#interfaces", getAllInterfaces());
vars.put("#stub_method_declarations", getStubMethodDeclarations());
vars.put("#stub_method_initializations", getStubMethodInitializations());
if (addZeroSizeObjecArray)
{
vars.put("#zeroSizeObjecArray",
"private static final Object[] NO_ARGS = new Object[0];");
vars.put("#zeroSizeClassArray",
"final Class[] NO_ARGSc = new Class[0];");
}
else
{
vars.put("#zeroSizeObjecArray","");
vars.put("#zeroSizeClassArray","");
}
String output = replaceAll(template, vars);
return output;
}
/**
* Create a method generator, applicable for RMI stub methods.
*/
protected AbstractMethodGenerator createMethodGenerator(Method m)
{
return new RmiMethodGenerator(m, this);
}
/**
* Get the stub method declarations.
*/
public String getStubMethodDeclarations()
{
StringBuffer b = new StringBuffer();
Iterator iter = methods.iterator();
while (iter.hasNext())
{
RmiMethodGenerator method = (RmiMethodGenerator) iter.next();
b.append(" ");
b.append("private static final Method met_");
b.append(method.method.getName());
b.append(';');
if (iter.hasNext())
b.append('\n');
}
return b.toString();
}
/**
* Get stub method initializations. These must be done in a try-catch
* statement to catch {@link NoSuchMethodException}.
*/
public String getStubMethodInitializations()
{
StringBuffer b = new StringBuffer();
Iterator iter = methods.iterator();
while (iter.hasNext())
{
RmiMethodGenerator method = (RmiMethodGenerator) iter.next();
b.append(" ");
b.append("met_");
b.append(method.method.getName());
b.append(" =\n ");
b.append(name(method.method.getDeclaringClass()));
b.append(".class.getMethod(");
b.append('"');
b.append(method.method.getName());
b.append("\", ");
if (method.method.getParameterTypes().length == 0)
b.append("NO_ARGSc);");
else
{
b.append("new Class[]\n {\n ");
b.append(method.getArgListAsClassArray());
b.append("\n }");
b.append(");");
}
b.append('\n');
}
return b.toString();
}
/**
* Prepare for the compilation of the next class.
*/
public void reset()
{
addZeroSizeObjecArray = false;
super.reset();
}
/**
* Additional processing of the stub name (nothing to do for JRMP stubs).
*/
public String convertStubName(String name)
{
return name;
}
}