근데 이번에 한꺼번에 대량 작업을 하려다 보니 너무 귀찮아져서 Java VO 디렉토리를 쭉 훑어서 특정 디렉토리 아래에 ActionScript VO로 변환해서 저장해 주는 초간단/초허접 프로그램을 만들어 보았다.
필요하신 분들은 용도에 맞춰 고쳐 쓰시고, 고쳐 달라고 하기는 없기~
package com.my.vo.data;
import com.my.vo.CommonVo;
// Generated 2009. 8. 24 ???? 12:54:51 by Hibernate Tools 3.2.4.GA
/**
* Foo generated by hbm2java
*/
public class FooVo extends CommonVo{
/**
*
*/
private static final long serialVersionUID = 4526158581216990458L;
public FooIdVo id;
public String barName;
public String barType;
public int barLength;
...
}
import com.my.vo.CommonVo;
// Generated 2009. 8. 24 ???? 12:54:51 by Hibernate Tools 3.2.4.GA
/**
* Foo generated by hbm2java
*/
public class FooVo extends CommonVo{
/**
*
*/
private static final long serialVersionUID = 4526158581216990458L;
public FooIdVo id;
public String barName;
public String barType;
public int barLength;
...
}
이것이 원본 Java VO
package vo.data
{
import vo.CommonVo;
[Bindable]
[RemoteClass(alias="com.my.vo.data.FooVo")]
public class FooVo extends CommonVo
{
public var id:FooIdVo;
public var barName:String;
public var barDesc:String;
public var barType:String;
public var barLength:int;
}
}
{
import vo.CommonVo;
[Bindable]
[RemoteClass(alias="com.my.vo.data.FooVo")]
public class FooVo extends CommonVo
{
public var id:FooIdVo;
public var barName:String;
public var barDesc:String;
public var barType:String;
public var barLength:int;
}
}
이것이 원하는 형태의 ActionScript VO
package flex;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class ConvertJavaToAS {
public static final String packagePrefix = "com.my.";
public static void main(String[] args) throws Exception {
String javaDir = "C:/workspace/com/my/vo";
String asDir = "D:/temp/vo";
File inDir = new File(javaDir);
traverse(inDir, asDir);
}
public static void traverse(File in, String out) throws Exception {
File[] files = in.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory())
traverse(files[i], out);
else if (files[i].getName().endsWith("Vo.java")){
convert(files[i], out);
}
}
}
public static void convert(File java, String out) throws Exception {
BufferedReader br = new BufferedReader(new FileReader(java));
String strPackage = "";
String strClass = "";
StringBuilder strVar = new StringBuilder();
String line = null;
while ( (line = br.readLine()) != null ) {
if (!strClass.equals("") && line.trim().startsWith("public " + strClass + "("))
break;
else if (line.trim().startsWith("package")) {
String[] strs = line.trim().split(" ");
strPackage = strs[1].substring(0, strs[1].length()-1);
}
else if (line.trim().startsWith("public class")) {
String[] strs = line.trim().split(" ");
strClass = strs[2];
}
else if (line.trim().startsWith("public")) {
String[] strs = line.trim().split(" ");
strVar.append("\t\tpublic var ")
.append(strs[2].substring(0, strs[2].length()-1)).append(":")
.append(mapDataType(strs[1])).append(";\n");
}
}
br.close();
save(strPackage, strClass, strVar.toString(), out);
}
public static String mapDataType(String javaType) {
if (javaType.equals("BigDecimal")) {
return "String";
}
else
return javaType;
}
public static void save(String pack, String clazz, String vars, String out) throws Exception {
String subdir = pack.substring(pack.lastIndexOf(".")+1);
String outDir = out + "/" + subdir;
File asDir = new File(outDir);
if (!asDir.exists())
asDir.mkdirs();
String asPackage = pack.substring(packagePrefix.length());
BufferedWriter bw = new BufferedWriter(new FileWriter(outDir + "/" + clazz + ".as"));
bw.write("package " + asPackage + "\n{\n");
bw.write("\timport vo.CommonVo\n\n");
bw.write("\t[Bindable]\n");
bw.write("\t[RemoteClass(alias=\"" + pack + "." + clazz + "\")]\n\n");
bw.write("\tpublic class " + clazz + " extends CommonVo\n\t{\n");
bw.write(vars);
bw.write("\t}\n}");
bw.flush();
bw.close();
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class ConvertJavaToAS {
public static final String packagePrefix = "com.my.";
public static void main(String[] args) throws Exception {
String javaDir = "C:/workspace/com/my/vo";
String asDir = "D:/temp/vo";
File inDir = new File(javaDir);
traverse(inDir, asDir);
}
public static void traverse(File in, String out) throws Exception {
File[] files = in.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory())
traverse(files[i], out);
else if (files[i].getName().endsWith("Vo.java")){
convert(files[i], out);
}
}
}
public static void convert(File java, String out) throws Exception {
BufferedReader br = new BufferedReader(new FileReader(java));
String strPackage = "";
String strClass = "";
StringBuilder strVar = new StringBuilder();
String line = null;
while ( (line = br.readLine()) != null ) {
if (!strClass.equals("") && line.trim().startsWith("public " + strClass + "("))
break;
else if (line.trim().startsWith("package")) {
String[] strs = line.trim().split(" ");
strPackage = strs[1].substring(0, strs[1].length()-1);
}
else if (line.trim().startsWith("public class")) {
String[] strs = line.trim().split(" ");
strClass = strs[2];
}
else if (line.trim().startsWith("public")) {
String[] strs = line.trim().split(" ");
strVar.append("\t\tpublic var ")
.append(strs[2].substring(0, strs[2].length()-1)).append(":")
.append(mapDataType(strs[1])).append(";\n");
}
}
br.close();
save(strPackage, strClass, strVar.toString(), out);
}
public static String mapDataType(String javaType) {
if (javaType.equals("BigDecimal")) {
return "String";
}
else
return javaType;
}
public static void save(String pack, String clazz, String vars, String out) throws Exception {
String subdir = pack.substring(pack.lastIndexOf(".")+1);
String outDir = out + "/" + subdir;
File asDir = new File(outDir);
if (!asDir.exists())
asDir.mkdirs();
String asPackage = pack.substring(packagePrefix.length());
BufferedWriter bw = new BufferedWriter(new FileWriter(outDir + "/" + clazz + ".as"));
bw.write("package " + asPackage + "\n{\n");
bw.write("\timport vo.CommonVo\n\n");
bw.write("\t[Bindable]\n");
bw.write("\t[RemoteClass(alias=\"" + pack + "." + clazz + "\")]\n\n");
bw.write("\tpublic class " + clazz + " extends CommonVo\n\t{\n");
bw.write(vars);
bw.write("\t}\n}");
bw.flush();
bw.close();
}
}
이것이 변환 프로그램
사용시 수정해야 할 것들은 굵은 글씨도 표시된 부분
1. packagePrefix : Java VO와 ActionScript VO의 패키지 경로를 다르게 사용할 경우 Java VO의 package에서 잘라내야 할 앞부분. 같은 패키지 경로를 사용하면 이걸 빈 문자열로 설정하면 된다.
2. javaDir : Java VO 들이 있는 최상위 디렉토리. 이 아래에 있는 모든 Java VO를 찾아서 ActionScript VO로 변환한다.
3. asDir : 생성된 ActionScript VO들을 저장할 디렉토리. 패키지에 따라 하위디렉토리를 만들어서 저장.
4. Vo.java : 나는 일단 Java VO 파일의 postfix가 Vo.java라서 이렇게 썼고, 필요에 따라서 고쳐 쓰시길.
5. mapDataType : Java의 데이터타입을 AS이 데이터타입으로 매핑시켜 주는 메소드. 원하는만큼 추가해 주면 됨.
6. CommonVo : 나는 공통으로 상속할 상위클래스가 있어서 이렇게 썼고, 필요없으면 빼고 다르면 고쳐서 쓰시길...
띄어 쓰기 같은 건 무조건 한칸으로 가정하고 처리했으니까 Hibernate Tools로 생성한 VO를 사용하거나, 줄 잘 맞춰서 직접 정성껏 만든 VO를 사용해야 원하는 결과를 얻을 수 있다.
댓글 없음:
댓글 쓰기