Java2AS3
javaのトランスファオブジェクト から ActionScript 3.0 を生成するソースコードトランスレータです。
ポイントはAS3ってところ。
これで正しく動くかは・・・もう少々お待ちを。
Java2AS3.java version0.0.1
package flexcoder.java2as3;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.HashMap;
/**
* flexcoder.java2as3.Java2AS3
*
* @author sato-shi
* @version 0.0.1
* @description JavaのVOからASのVOを自動で生成する
*/
public class Java2AS3 {
public static void main(String args[]) {
if (args.length == 1) {
generateAS(args[0]);
} else {
System.out.println("Invalid list of arguments");
System.out.println("Usage: java Java2AS3 classname");
}
}
public static HashMap generateAS(String javaClass) {
StringBuffer asSource = new StringBuffer();
StringBuffer messages = new StringBuffer();
BufferedWriter out = null;
try {
Class clazz = Class.forName(javaClass);
String className = clazz.getName();
if (!(clazz.newInstance() instanceof java.io.Serializable)) {
messages.append("WARNING: Class " + className
+ " does not implement java.io.Serializable\n");
}
int lastDot = className.lastIndexOf(".");
String shortClassName = lastDot < 0 ? className : className
.substring(lastDot + 1);
Package packageClass = clazz.getPackage();
String propertyName = null;
// コメント
asSource.append("/**\n");
asSource.append(" * クラス名 : " + className + "\n");
asSource.append(" * 作成日時 : " + new Date() + "\n");
asSource.append(" */\n");
// パッケージ名の宣言
asSource.append("package " + packageClass.getName() + " {\n");
asSource.append("\n\t[Managed]\n");
asSource.append("\t[RemoteClass(alias=\"" + className + "\")]\n");
// クラス名の宣言
asSource.append("\tpublic class " + shortClassName + " {\n\n");
// フィールド名の宣言
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
propertyName = field.getName();
if (!propertyName.equals("class")) {
asSource.append("\t\tpublic var " + propertyName + " : "
+ getASType(field.getType()) + ";\n");
}
}
// コンストラクタの宣言(実装予定)
// メソッドの宣言(実装予定)
// クラスを閉じる
asSource.append("\n\t}");
// パッケージを閉じる
asSource.append("\n}");
System.out.println(asSource);
out = new BufferedWriter(new FileWriter(shortClassName + ".as"));
out.write(asSource.toString());
messages
.append(shortClassName + ".as successfully written to disk");
} catch (ClassNotFoundException e) {
messages.append("ERROR: Class " + javaClass + " not found");
} catch (InstantiationException e) {
messages.append("ERROR: Class " + javaClass
+ " must have a no-argument constructor");
} catch (IllegalAccessException e) {
messages.append(e.getMessage());
} catch (IOException e) {
messages.append(e.getMessage());
} finally {
try {
if (out != null)
out.close();
} catch (IOException e) {
}
}
HashMap map = new HashMap();
map.put("source", asSource.toString());
map.put("messages", messages.toString());
return map;
}
public static String getASType(Class type) {
String typeName = type.getName();
System.out.println(typeName);
if (typeName.equals("java.lang.String")) {
return "String";
} else if (typeName.equals("int") || typeName.equals("short")
|| typeName.equals("byte")) {
return "int";
} else if (typeName.equals("long")) {
return "uint";
} else if (typeName.equals("double") || typeName.equals("float")
|| typeName.equals("java.lang.Integer")
|| typeName.equals("java.lang.Long")
|| typeName.equals("java.lang.Short")
|| typeName.equals("java.lang.Double")
|| typeName.equals("java.lang.Float")
|| typeName.equals("java.lang.Byte")) {
return "Number";
} else if (typeName.equals("boolean")
|| typeName.equals("java.lang.Boolean")) {
return "Boolean";
} else if (typeName.equals("java.util.ArrayList")
|| typeName.equals("java.util.List")) {
return "Array";
} else if (typeName.equals("java.util.Date")) {
return "Date";
} else if (typeName.equals("org.w3c.dom.Document")) {
return "XML";
} else {
return "Object";
}
}
}
例です。
これが、
package flexcoder.java2as3.sample;
import java.util.Date;
import java.util.List;
public class Person {
public String name;
public String address;
public int age;
public Date birthDay;
public List memory;
}こうなります。
/**
* クラス名 : flexcoder.java2as3.sample.Person
* 作成日時 : Mon Feb 13 14:34:17 JST 2006
*/
package flexcoder.java2as3.sample {
[Managed]
[RemoteClass(alias="flexcoder.java2as3.sample.Person")]
public class Person {
public var name : String;
public var address : String;
public var age : int;
public var birthDay : Date;
public var memory : Array;
}
}
思い出が配列・・・。
参考資料
Java2AS: Automatically generating ActionScript classes based on Java Value Objects