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

http://coenraets.com/viewarticle.jsp?articleId=74