package jp.igapyon.jcfa;\r
\r
-import java.io.BufferedWriter;\r
import java.io.File;\r
-import java.io.FileOutputStream;\r
import java.io.IOException;\r
-import java.io.OutputStreamWriter;\r
\r
-import jp.igapyon.jcfa.util.JcfaEclipseUtil;\r
import jp.igapyon.jcfa.util.JcfaUtil;\r
+import jp.igapyon.jcfa.util.JcfaWriteUtil;\r
import jp.igapyon.jcfa.vo.JcfaClass;\r
import jp.igapyon.jcfa.vo.JcfaField;\r
import jp.igapyon.jcfa.vo.JcfaMethod;\r
protected JcfaUnit jcfaUnit = new JcfaUnit();\r
\r
public static final void main(final String[] args) {\r
- new JavaClassFileAnalyzer().process(new File(\r
- "./bin/test/TestJavaClass002.class"), new File(\r
- "./testJavaClass/output"));\r
+ new JavaClassFileAnalyzer().parseDir(new File("./bin/test"));\r
+ }\r
+\r
+ private void parseDir(final File dir) {\r
+ final File[] files = dir.listFiles();\r
+ if (files == null) {\r
+ return;\r
+ }\r
+ for (File file : files) {\r
+ if (file.isDirectory()) {\r
+ parseDir(file);\r
+ }\r
+ if (file.isFile()) {\r
+ if (file.getName().endsWith(".class")) {\r
+ new JavaClassFileAnalyzer().process(file, new File(\r
+ "./testJavaClass/output"));\r
+ }\r
+ }\r
+ }\r
}\r
\r
private final void process(final File inputFile, final File outputDir) {\r
jcfaClass.setName(jc.getClassName());\r
jcfaClass.setExtendsName(jc.getSuperclassName());\r
\r
- // TODO interaface.\r
+ jcfaClass.getComment().getCommentList()\r
+ .add("TODO import func. is missing.");\r
\r
final String[] split = jc.getClassName().split("\\.");\r
File actualyTargetDir = outputDir;\r
jcfaUnit.setTargetFile(new File(actualyTargetDir,\r
split[split.length - 1] + ".jcfa"));\r
\r
- writeToFile(jcfaUnit);\r
+ JcfaWriteUtil.writeToFile(jcfaUnit);\r
} catch (ClassFormatException e) {\r
e.printStackTrace();\r
} catch (IOException e) {\r
}\r
}\r
\r
- private void writeToFile(final JcfaUnit jcfaUnit) throws IOException {\r
- final StringBuffer result = new StringBuffer();\r
- for (JcfaClass jcfaClass : jcfaUnit.getClassList()) {\r
- writeToBuffer(jcfaClass, result);\r
- }\r
-\r
- final BufferedWriter writer = new BufferedWriter(\r
- new OutputStreamWriter(new FileOutputStream(\r
- jcfaUnit.getTargetFile())));\r
- writer.write(JcfaEclipseUtil.formatSource(result.toString()));\r
- writer.close();\r
- }\r
-\r
- private void writeToBuffer(final JcfaClass jcfaClass,\r
- final StringBuffer result) {\r
- result.append(jcfaClass.getAccess());\r
- result.append(" class " + jcfaClass.getLocalName());\r
- if (jcfaClass.getExtendsName() != null\r
- && jcfaClass.getExtendsName().length() > 0\r
- && jcfaClass.getExtendsName().equals("java.lang.Object") == false) {\r
- result.append(" extends " + jcfaClass.getExtendsName());\r
- }\r
- result.append("{");\r
-\r
- for (JcfaField jcfaField : jcfaClass.getFieldList()) {\r
- writeToBuffer(jcfaField, result);\r
- }\r
-\r
- for (JcfaMethod jcfaMethod : jcfaClass.getMethodList()) {\r
- writeToBuffer(jcfaMethod, result);\r
- }\r
-\r
- result.append("}");\r
- }\r
-\r
- private void writeToBuffer(final JcfaField jcfaField,\r
- final StringBuffer result) {\r
-\r
- }\r
-\r
- private void writeToBuffer(final JcfaMethod jcfaMethod,\r
- final StringBuffer result) {\r
-\r
- }\r
-\r
private void analyzeFields(final JavaClass jc, final JcfaClass jcfaClass) {\r
final org.apache.bcel.classfile.Field[] fields = jc.getFields();\r
for (int indexField = 0; indexField < fields.length; indexField++) {\r
jcfaField.setName(field.getName());\r
jcfaClass.getFieldList().add(jcfaField);\r
\r
+ // TODO type should be more collect.\r
+ jcfaField.setType(field.getType().toString());\r
+\r
String access = "";\r
access += field.isPublic() ? "public " : "";\r
access += field.isProtected() ? "protected " : "";\r
access += field.isFinal() ? "final " : "";\r
jcfaField.setAccess(access);\r
\r
- String constValue = null;\r
final ConstantValue cv = field.getConstantValue();\r
if (cv != null) {\r
- jcfaField.setConstantValue(jc.getConstantPool().getConstantString(\r
- cv.getConstantValueIndex(), Constants.CONSTANT_String));\r
- // FIXME other type support add.\r
- jcfaField.setConstantValueType(Constants.CONSTANT_String);\r
+ jcfaField.setConstantValue("\""\r
+ + jc.getConstantPool().getConstantString(\r
+ cv.getConstantValueIndex(),\r
+ Constants.CONSTANT_String) + "\"");\r
+\r
+ jcfaField\r
+ .getComment()\r
+ .getCommentList()\r
+ .add("FIXME other type support is missing. <br />Now only String.");\r
}\r
-\r
- System.out.println(" " + access + field.getType().toString() + " "\r
- + field.getName()\r
- + (constValue == null ? "" : " = \"" + constValue + "\""));\r
}\r
\r
private void analyzeMethods(final JavaClass jc, final JcfaClass jcfaClass)\r
jcfaClass.getMethodList().add(jcfaMethod);\r
\r
jcfaMethod.setName(method.getName());\r
+ if (jcfaMethod.getName().equals("<init>")) {\r
+ jcfaMethod.getComment().setJavaDoc(true);\r
+ jcfaMethod.getComment().getCommentList()\r
+ .add("Default constructor.");\r
+ }\r
\r
final Code code = method.getCode();\r
if (code == null) {\r
final short opcode = JcfaUtil.byte2UnsignedByte(codes[pc]);\r
short operands = Constants.NO_OF_OPERANDS[opcode];\r
if (operands < 0) {\r
- System.out.println(" TODO negative value:"\r
+ System.err.println(" TODO negative value:"\r
+ Constants.OPCODE_NAMES[opcode] + ": " + operands);\r
// break;\r
}\r