OSDN Git Service

save.
[jcfa/jcfa.git] / jcfa / src / jp / igapyon / jcfa / JavaClassFileAnalyzer.java
index 4217eda..1e2e369 100644 (file)
@@ -1,13 +1,10 @@
 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
@@ -26,9 +23,25 @@ public class JavaClassFileAnalyzer {
        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
@@ -41,7 +54,8 @@ public class JavaClassFileAnalyzer {
                        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
@@ -58,7 +72,7 @@ public class JavaClassFileAnalyzer {
                        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
@@ -66,51 +80,6 @@ public class JavaClassFileAnalyzer {
                }\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
@@ -125,6 +94,9 @@ public class JavaClassFileAnalyzer {
                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
@@ -135,18 +107,18 @@ public class JavaClassFileAnalyzer {
                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
@@ -165,6 +137,11 @@ public class JavaClassFileAnalyzer {
                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
@@ -176,7 +153,7 @@ public class JavaClassFileAnalyzer {
                        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