/**
*
* Copyright 2004-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.geronimo.interop.generator;
import java.io.File;
import java.lang.reflect.Modifier;
import java.util.Vector;
public class JavaGenerator implements Generator {
private GenOptions genOptions;
public JavaGenerator(GenOptions genOptions) {
this.genOptions = genOptions;
}
public GenOptions getGenOptions() {
return genOptions;
}
public void setGenOptions(GenOptions genOptions) {
this.genOptions = genOptions;
}
public void generate(JEntity e) {
// Meaningless
}
public void generate(JPackage p)
throws GenException {
if (p == null) {
return;
}
Vector v = p.getClasses();
if (v != null && v.size() > 0) {
int i;
for (i = 0; i < v.size(); i++) {
generate((JClass) v.elementAt(i));
}
}
}
public void generate(JClass c)
throws GenException {
if (c == null) {
return;
}
String className = c.getName();
String pkgName = c.getPackage().getName();
pkgName = pkgName.replace('.', File.separatorChar);
String fullName = pkgName + "/" + className;
JavaWriter jw = new JavaWriter(genOptions, fullName, ".java");
jw.openFile();
writeClass(jw, c);
jw.closeFile();
}
protected void writeClass(JavaWriter jw, JClass c) {
writeClassPackage(jw, c);
writeClassImports(jw, c);
writeClassClassDefn(jw, c);
jw.begin();
writeClassFields(jw, c);
writeClassConstructors(jw, c);
writeClassMethods(jw, c);
jw.end();
}
protected void writeClassPackage(JavaWriter jw, JClass c) {
if (c.getPackage().getName().length() > 0) {
jw.newln();
jw.println("package " + c.getPackage().getName() + ";");
}
}
protected void writeClassImports(JavaWriter jw, JClass c) {
Vector v = c.getImports();
if (v != null && v.size() > 0) {
int i;
jw.newln();
for (i = 0; i < v.size(); i++) {
jw.println("import " + v.elementAt(i) + ";");
}
}
}
protected void writeClassClassDefn(JavaWriter jw, JClass c) {
jw.newln();
writeModifiers(jw, c.getModifiers());
jw.println("class " + c.getName());
if (c.getExtends() != null && c.getExtends().length() > 0) {
jw.indent();
jw.println("extends " + c.getBaseClassName());
jw.outdent();
}
Vector v = c.getImplements();
if (v != null && v.size() > 0) {
int i;
jw.indent();
jw.print("implements ");
jw.outdent();
for (i = 0; i < v.size(); i++) {
jw.print("" + v.elementAt(i));
if (i + 1 != v.size()) {
jw.print(", ");
}
}
jw.println("");
}
}
protected void writeClassFields(JavaWriter jw, JClass c) {
Vector v = c.getFields();
if (v != null && v.size() > 0) {
jw.comment("");
jw.comment("Fields");
jw.comment("");
int i;
JField f;
for (i = 0; i < v.size(); i++) {
f = (JField) v.elementAt(i);
writeClassField(jw, c, f);
}
}
}
protected void writeClassField(JavaWriter jw, JClass c, JField f) {
writeModifiers(jw, f.getModifiers());
jw.print(f.getTypeDecl() + " " + f.getName());
if (f.getInitExpression() != null) {
jw.print(" = ");
writeExpression(jw, f.getInitExpression());
}
jw.println(";");
}
protected void writeClassConstructors(JavaWriter jw, JClass c) {
Vector v = c.getConstructors();
if (v != null && v.size() > 0) {
int i;
JMethod m;
jw.newln();
jw.comment("");
jw.comment("Constructors");
jw.comment("");
for (i = 0; i < v.size(); i++) {
m = (JMethod) v.elementAt(i);
writeClassMethod(jw, c, m);
}
}
}
protected void writeClassMethods(JavaWriter jw, JClass c) {
Vector v = c.getMethods();
if (v != null && v.size() > 0) {
int i;
JMethod m;
jw.newln();
jw.comment("");
jw.comment("Methods");
jw.comment("");
for (i = 0; i < v.size(); i++) {
jw.newln();
m = (JMethod) v.elementAt(i);
writeClassMethod(jw, c, m);
}
}
}
protected void writeClassMethod(JavaWriter jw, JClass c, JMethod m) {
writeModifiers(jw, m.getModifiers());
if (m instanceof JConstructor) {
jw.print(c.getName());
} else {
jw.print(m.getRT().getTypeDecl());
jw.print(" " + m.getName());
}
jw.print("(");
JParameter p[] = m.getParms();
if (p != null && p.length > 0) {
int i;
for (i = 0; i < p.length; i++) {
jw.print(" " + p[i].getTypeDecl() + " " + p[i].getName());
if (i + 1 != p.length) {
jw.print(",");
}
}
}
jw.print(" )");
//String s[] = m.getThrownType();
Class s[] = m.getThrown();
if (s != null && s.length > 0) {
int i;
jw.print(" throws ");
for (i = 0; i < s.length; i++) {
jw.print(s[i].getName());
if (i + 1 != s.length) {
jw.print(", ");
}
}
}
jw.println("");
jw.begin();
writeLocalVariables(jw, m.getLocalVariables());
writeStatements(jw, m.getStatements());
if (m.getBody() != null && m.getBody().length() > 0) {
jw.println(m.getBody());
}
jw.end();
}
protected void writeLocalVariables(JavaWriter jw, Vector lv) {
if (lv != null && lv.size() > 0) {
int i;
for (i = 0; i < lv.size(); i++) {
writeLocalVariable(jw, (JLocalVariable) lv.elementAt(i));
}
}
}
protected void writeLocalVariable(JavaWriter jw, JLocalVariable lv) {
jw.print(lv.getTypeDecl() + " " + lv.getName());
if (lv.getInitExpression() != null) {
jw.print(" = ");
writeExpression(jw, lv.getInitExpression());
}
jw.println(";");
}
protected void writeStatements(JavaWriter jw, Vector sv) {
if (sv != null && sv.size() > 0) {
int i;
for (i = 0; i < sv.size(); i++) {
writeStatement(jw, (JStatement) sv.elementAt(i));
}
}
}
protected void writeModifiers(JavaWriter jw, int m) {
String s = Modifier.toString(m);
if (s != null && s.length() > 0) {
jw.print(s + " ");
}
}
protected void writeStatement(JavaWriter jw, JStatement s) {
if (s instanceof JCaseStatement) {
writeCaseStatement(jw, (JCaseStatement) s);
} else if (s instanceof JCatchStatement) {
writeCatchStatement(jw, (JCatchStatement) s);
} else if (s instanceof JCodeStatement) {
writeCodeStatement(jw, (JCodeStatement) s, true);
} else if (s instanceof JDeclareStatement) {
writeDeclareStatement(jw, (JDeclareStatement) s);
} else if (s instanceof JElseStatement) {
writeElseStatement(jw, (JElseStatement) s);
} else if (s instanceof JElseIfStatement) {
writeElseIfStatement(jw, (JElseIfStatement) s);
} else if (s instanceof JIfElseIfElseStatement) {
writeIfElseIfElseStatement(jw, (JIfElseIfElseStatement) s);
} else if (s instanceof JFinallyStatement) {
writeFinallyStatement(jw, (JFinallyStatement) s);
} else if (s instanceof JForStatement) {
writeForStatement(jw, (JForStatement) s);
} else if (s instanceof JIfStatement) {
writeIfStatement(jw, (JIfStatement) s);
} else if (s instanceof JTryCatchFinallyStatement) {
writeTryCatchFinallyStatement(jw, (JTryCatchFinallyStatement) s);
} else if (s instanceof JSwitchStatement) {
writeSwitchStatement(jw, (JSwitchStatement) s);
} else if (s instanceof JTryStatement) {
writeTryStatement(jw, (JTryStatement) s);
} else if (s instanceof JBlockStatement) {
// BlockStatemnet should be last since there are other subclasses of it.
writeBlockStatement(jw, (JBlockStatement) s);
} else {
jw.comment("");
jw.comment("Error: Unknown statement: " + s);
jw.comment("");
}
}
protected void writeBlockStatement(JavaWriter jw, JBlockStatement bs) {
jw.begin();
writeLocalVariables(jw, bs.getLocalVariables());
writeStatements(jw, bs.getStatements());
jw.end();
}
protected void writeCaseStatement(JavaWriter jw, JCaseStatement cs) {
jw.print("case ");
writeExpression(jw, cs.getExpression());
jw.println(":");
writeStatement(jw, cs.getStatement());
jw.println("break;");
}
protected void writeCatchStatement(JavaWriter jw, JCatchStatement cs) {
jw.println("catch( " + cs.getVariable().getTypeDecl() + " " + cs.getVariable().getName() + " )");
writeBlockStatement(jw, cs);
//writeStatement( jw, cs.getStatement() );
}
protected void writeCodeStatement(JavaWriter jw, JCodeStatement cs, boolean newLine) {
jw.print(cs.getCode());
if (newLine) {
jw.newln();
}
//jw.print( cs.getCode() );
//jw.println( ";" );
}
protected void writeDeclareStatement(JavaWriter jw, JDeclareStatement ds) {
JVariable v = ds.getVariable();
jw.print(v.getTypeDecl() + " " + v.getName());
JExpression e = ds.getInitExpression();
if (e != null) {
jw.print(" = ");
writeExpression(jw, e);
}
jw.println(";");
}
protected void writeElseStatement(JavaWriter jw, JElseStatement es) {
if (es.hasStatements()) {
jw.println("else");
writeBlockStatement(jw, es);
}
}
protected void writeElseIfStatement(JavaWriter jw, JElseIfStatement eis) {
if (eis.hasStatements()) {
jw.print("else ");
writeIfStatement(jw, eis);
}
}
protected void writeIfElseIfElseStatement(JavaWriter jw, JIfElseIfElseStatement ies) {
writeIfStatement(jw, ies.getIfStatement());
}
protected void writeExpression(JavaWriter jw, JExpression e) {
// TODO: not sure how I am going to do this but...
if (e.getStatement() instanceof JCodeStatement) {
JCodeStatement cs = (JCodeStatement) e.getStatement();
writeCodeStatement(jw, cs, false);
//jw.print( cs.getCode() );
} else {
writeStatement(jw, e.getStatement());
}
}
protected void writeFinallyStatement(JavaWriter jw, JFinallyStatement fs) {
if (fs.hasStatements()) {
jw.println("finally");
writeStatement(jw, fs.getStatement());
}
}
protected void writeForStatement(JavaWriter jw, JForStatement fs) {
jw.newln();
jw.print("for (");
writeStatement(jw, fs.getInitStatement());
jw.print(";");
writeExpression(jw, fs.getLoopExpression());
writeStatement(jw, fs.getIterStatement());
jw.println(")");
writeBlockStatement(jw, fs);
//writeBlockStatement( jw, fs.getStatement() );
}
protected void writeIfStatement(JavaWriter jw, JIfStatement is) {
jw.newln();
jw.print("if (");
writeExpression(jw, is.getExpression());
jw.println(")");
writeBlockStatement(jw, is);
}
protected void writeSwitchStatement(JavaWriter jw, JSwitchStatement ss) {
jw.newln();
jw.print("switch (");
writeExpression(jw, ss.getExpression());
jw.println(")");
jw.begin();
writeStatements(jw, ss.getCases());
jw.end();
}
protected void writeTryCatchFinallyStatement(JavaWriter jw, JTryCatchFinallyStatement tcfs) {
writeStatement(jw, tcfs.getTryStatement());
writeStatements(jw, tcfs.getCatches());
writeStatement(jw, tcfs.getFinallyStatement());
}
protected void writeTryStatement(JavaWriter jw, JTryStatement ts) {
jw.println("");
jw.println("try");
writeBlockStatement(jw, ts);
//writeStatement( jw, ts.getStatement() );
}
}