1 20 21 package cpmake; 22 23 import java.io.*; 24 import java.nio.*; 25 import java.nio.channels.*; 26 import java.util.*; 27 28 33 class JavaDependencyParser 34 implements DependencyParser, Serializable 35 { 36 private short getShort(FileInputStream fis) 37 throws IOException 38 { 39 ByteBuffer buf = ByteBuffer.allocate(2); 40 buf.order(ByteOrder.BIG_ENDIAN); 41 fis.getChannel().read(buf); 42 buf.rewind(); 43 return (buf.getShort()); 44 } 45 46 private byte[] read(FileInputStream fis, int readSz) 47 throws IOException 48 { 49 byte[] buf = new byte[readSz]; 50 fis.read(buf); 51 return (buf); 52 } 53 54 public boolean canRecurse() 55 { 56 return (false); 57 } 58 59 public String [] parseFile(File file) 60 throws IOException 61 { 62 int magic; 63 short majorVer; 64 short minVer; 65 short tableSz; 66 byte tag; 67 short strSz; 68 String className; 69 Map tableStrs = new HashMap(); 70 Stack classEntries = new Stack(); 71 Vector dependency = new Vector(); 72 ByteBuffer header = ByteBuffer.allocate(10); 73 FileInputStream fis = new FileInputStream(file); 74 76 header.order(ByteOrder.BIG_ENDIAN); 77 78 fis.getChannel().read(header); 79 header.rewind(); 80 magic = header.getInt(); 81 82 if (magic != 0xCAFEBABE) 83 return (new String [0]); 84 85 majorVer = header.getShort(); 86 minVer = header.getShort(); 87 if ((majorVer != 0) && (minVer < 48)) 88 return (new String [0]); 89 90 tableSz = header.getShort(); 92 for (int I = 1; I < tableSz; I++) 93 { 94 tag = (byte)fis.read(); 96 switch (tag) 97 { 98 case 1: 99 strSz = getShort(fis); 100 tableStrs.put(new Integer (I), new String (read(fis, strSz))); 101 break; 102 case 7: 103 classEntries.push(new Integer (getShort(fis))); 104 break; 105 case 8: 106 fis.skip(2); 107 break; 108 case 3: 109 case 4: 110 case 9: 111 case 10: 112 case 11: 113 case 12: 114 fis.skip(4); 115 break; 116 case 5: 117 case 6: 118 fis.skip(8); 119 break; 120 case 0: 121 I = tableSz; 122 break; 123 default: 124 System.out.println("Unknown tag "+tag); 125 126 } 127 } 128 129 fis.close(); 130 131 while (!classEntries.empty()) 132 { 133 className = (String )tableStrs.get((Integer )classEntries.pop()); 134 if (className != null) 135 { 136 dependency.add(className+".java"); 138 } 139 } 140 141 return ((String [])dependency.toArray(new String [0])); 142 } 143 } 144 | Popular Tags |