001 package plugins.JavaRolePluginModule; 002 003 import sharpster.common.*; 004 005 public class Extractor { 006 007 public static ResponseCollection extractPartsForDoc(SharedFile file) { 008 //returvariabeln 009 ResponseCollection returnResponseCollection = new ResponseCollection(); 010 011 Body fileBody = file.getBody(); 012 013 /*test om någon av filern är binärfil (behövs kanske inte) 014 if (fileBody.isBinary()) { 015 JavaRoleResponse res = new JavaRoleResponse(); 016 res.setError(true); 017 res.setSubError(SubError.SYNTAX_ERROR); 018 res.setFilename(file.getFileName()); 019 returnResponseCollection.addResponse(res); 020 return returnResponseCollection; 021 }*/ 022 023 String fileStr = new String(fileBody.getData()); 024 025 ParseTree tree = new ParseTree(fileStr); 026 if (tree.hasSyntaxError()) { 027 JavaRoleResponse res = new JavaRoleResponse(); 028 res.setError(true); 029 res.setSubError(SubError.SYNTAX_ERROR); 030 res.setFilename(file.getFileName()); 031 returnResponseCollection.addResponse(res); 032 return returnResponseCollection; 033 034 } 035 036 Entity current = tree.getFirstChildOfFile(); 037 while(current!=null) { 038 //RMTester.print(current); 039 if(current.type==Entity.DOCCOMMENT) { 040 Entity previous=tree.getPrevious(); 041 if(previous!=null && previous.type==Entity.DOCCOMMENT) { 042 tree.removeAndGetNext(); 043 current=tree.getNext(); 044 }else{ 045 tree.getNext(); 046 current=tree.getNext(); 047 } 048 } else if(current.type==Entity.METHODBODY) { 049 current.type=Entity.SEMICOLON; 050 current.endPos=current.contentStartPos=current.startPos; 051 current=tree.getNext(); 052 } else if(current.type==Entity.EXTRA) { 053 current=tree.removeAndGetNext(); 054 } else { 055 current=tree.getNext(); 056 } 057 } 058 SharedFilesResponse res = new SharedFilesResponse(); 059 FileCollection fc = new FileCollection(); 060 SharedFile sf = new SharedFile(file); 061 Body body = new Body(); 062 063 body.setData(tree.toString().getBytes()); 064 sf.setBody(body); 065 fc.addFile(sf); 066 067 res.setFiles(fc); 068 069 returnResponseCollection.addResponse(res); 070 return returnResponseCollection; 071 } 072 073 /** Att göra: 074 * 1. undersöka om filen är tom och hantera detta 075 * 2. säkerställa att inte flera DOCCOMMENT finns på rad 076 * och ta bort överflödiga. 077 */ 078 public static ResponseCollection extractPartsForRole(SharedFile file, String role) { 079 //returvariabeln 080 ResponseCollection returnResponseCollection = new ResponseCollection(); 081 082 Body fileBody = file.getBody(); 083 084 /*test om någon av filern är binärfil (behövs kanske inte) 085 if (fileBody.isBinary()) { 086 JavaRoleResponse res = new JavaRoleResponse(); 087 res.setError(true); 088 res.setSubError(SubError.SYNTAX_ERROR); 089 res.setFilename(file.getFileName()); 090 returnResponseCollection.addResponse(res); 091 return returnResponseCollection; 092 }*/ 093 094 String fileStr = new String(fileBody.getData()); 095 096 ParseTree tree = new ParseTree(fileStr); 097 if (tree.hasSyntaxError()) { 098 JavaRoleResponse res = new JavaRoleResponse(); 099 res.setError(true); 100 res.setSubError(SubError.SYNTAX_ERROR); 101 res.setFilename(file.getFileName()); 102 returnResponseCollection.addResponse(res); 103 return returnResponseCollection; 104 105 } 106 107 Entity current=tree.getFirstChildOfFile(); 108 while(current!=null) { 109 //System.out.print("Strip:");RMTester.print(current); 110 switch(current.type) { 111 case Entity.DOCCOMMENT: 112 /* Ensures no adjacent DOCCOMMENTs */ 113 if(tree.getPrevious().type==Entity.DOCCOMMENT) { 114 current=tree.removeAndGetNext(); 115 }else { 116 current=tree.getNext(); 117 } 118 119 if(current.getContent().indexOf("@sharpster."+role)>0) { 120 current=tree.getNextSkipHeadAndBody(); 121 }else{ 122 current.type=Entity.EXTRA; 123 current.startPos=current.contentStartPos=current.endPos; 124 current=tree.getNext(); 125 } 126 break; 127 case Entity.METHODHEAD: 128 case Entity.METHODBODY: 129 case Entity.SEMICOLON: 130 case Entity.VARIABLE: 131 current.type=Entity.EXTRA; 132 current.startPos=current.contentStartPos=current.endPos; 133 current=tree.getNext(); 134 break; 135 case Entity.EXTRA: 136 current.startPos=current.contentStartPos=current.endPos; 137 current=tree.getNext(); 138 break; 139 case Entity.ENDOFCLASSBODY: 140 current=removeClassIfEmptyAndGetNext(tree); 141 default: 142 current=tree.getNext(); 143 } 144 } 145 SharedFilesResponse res = new SharedFilesResponse(); 146 FileCollection fc = new FileCollection(); 147 SharedFile sf = new SharedFile(file); 148 Body body = new Body(); 149 150 body.setData(tree.toString().getBytes()); 151 sf.setBody(body); 152 fc.addFile(sf); 153 154 res.setFiles(fc); 155 156 returnResponseCollection.addResponse(res); 157 return returnResponseCollection; 158 159 160 } 161 162 /** The cursor in the parse tree should be at ENDOFCLASS. 163 * @return The next entity 164 */ 165 private static Entity removeClassIfEmptyAndGetNext(ParseTree tree) { 166 tree.getParent(); 167 Entity current=tree.getFirstChild(); 168 while(current.type!=Entity.ENDOFCLASSBODY) { 169 //System.out.print("remClIfEmpty:"); 170 //RMTester.print(current); 171 if(current.type==Entity.EXTRA) { 172 Entity previous=tree.getPrevious(); 173 if(previous!=null & previous.type==Entity.EXTRA) { 174 tree.removeAndGetNext(); 175 } else { 176 tree.getNext(); // current 177 } 178 current=tree.getNext(); 179 } else { 180 //behåll klassen 181 tree.getParent(); 182 current=tree.getNextSkipHeadAndBody(); 183 return current; 184 } 185 } 186 tree.getPrevious(); // classhead 187 if(tree.removeAndGetPrevious().type==Entity.DOCCOMMENT) { 188 return tree.removeAndGetNext(); 189 }else{ 190 return tree.getNext(); 191 } 192 } 193 194 /** The cursor is at ENDOFFILE 195 * @return True if the file is "empty" 196 */ 197 private static boolean fileIsEmpty(ParseTree tree) { 198 tree.getParent(); // file 199 Entity current=tree.getFirstChildOfFile(); 200 while(current.type!=Entity.ENDOFFILE) { 201 if(current.type!=Entity.EXTRA) { 202 return false; 203 } 204 current=tree.getNextSkipHeadAndBody(); 205 } 206 return true; 207 } 208 209 }