2013-01-12 54 views
3

我正在寫一些代碼來解析Java源代碼。我正在嘗試Eclipse JDT AST Parser。我的代碼如下。 (解析代碼)。我正在使用Java編寫的Mailer應用程序測試解析器(第二個代碼段)。我的解析器訪問除了generateEmail()和debug()方法之外的所有方法。我到處都看過,但我無法理解我的生活爲什麼會發生。誰能告訴我我做錯了什麼?這是一個記憶問題嗎?我沒有得到任何OutOfMemoryExceptionEclipse JDT ASTParser - 問題與方法訪問

我想通過MethodVisitor方法訪問特定的方法來訪問特定方法中的語句和變量。

我的解析代碼

public class RuleEngine { 

public static void parse(String file) { 
    File java = new File(file); 
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    String code = readFile(java); 
    parser.setSource(code.toCharArray()); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 
    final CompilationUnit cu = (CompilationUnit) parser.createAST(null); 


    cu.accept(new ASTVisitor() { 

     public boolean visit(ImportDeclaration id) { 
      Name imp = id.getName(); 
      debug("import", id.getName().getFullyQualifiedName()); 
      return false; 
     } 

     public boolean visit(VariableDeclarationFragment node) { 
      SimpleName name = node.getName(); 
      debug("var.declaration", (name.getFullyQualifiedName() + ":" + cu.getLineNumber(name.getStartPosition()))); 
      return false; // do not continue 
     } 

     public boolean visit(MethodDeclaration method) { 
      debug("method", method.getName().getFullyQualifiedName()); 
      debug("method.return", method.getReturnType2().toString()); 
      List<SingleVariableDeclaration> params = method.parameters(); 

      for(SingleVariableDeclaration param: params) { 
       debug("param", param.getName().getFullyQualifiedName()); 
      } 

      Block methodBlock = method.getBody(); 
      String myblock = methodBlock.toString(); 
      methodVisitor(myblock); 
      return false; 
     } 


    }); 

} 

public static void methodVisitor(String content) { 
    debug("entering met visitor", "1"); 
    ASTParser metparse = ASTParser.newParser(AST.JLS3); 
    metparse.setSource(content.toCharArray()); 
    metparse.setKind(ASTParser.K_STATEMENTS); 
    Block block = (Block) metparse.createAST(null); 

    block.accept(new ASTVisitor() { 
     public boolean visit(VariableDeclarationFragment var) { 
      debug("met.var", var.getName().getFullyQualifiedName()); 
      return false; 
     } 

     public boolean visit(SimpleName node) { 
      debug("SimpleName node", node.getFullyQualifiedName()); 
      return false; 
     } 
     public boolean visit(IfStatement myif) { 
      debug("if.statement", myif.toString()); 
      return false; 
     } 

    }); 
} 

public static void debug(String ref, String message) { 
    System.out.println(ref +": " + message); 
} 

public static void main(String[]args) { 
    parse("MailerDaemon.java"); 
} 

這是我的MailerDaemon代碼

public boolean isBccMode() { 
    return bccMode; 
} 

public void setBccMode(boolean bccMode) { 
    this.bccMode = bccMode; 
} 

public void setServerPort(String serverPortAddr) { 
    String[] elems = serverPortAddr.split("\\:"); 
    this.setServerAddr(elems[0]); 
    this.setSmtpPort(elems[1]); 
} 

public String getServerAddr() { 
    int i = 0; 
    return serverAddr; 
} 
public void setServerAddr(String serverAddr) { 
    this.serverAddr = serverAddr; 
} 
public boolean isSslOn() { 
    return isSslOn; 
} 
public void setSslOn(boolean isSslOn) { 
    this.isSslOn = isSslOn; 
} 
public String getSmtpPort() { 
    return smtpPort; 
} 
public void setSmtpPort(String smtpPort) { 
    this.smtpPort = smtpPort; 
} 
public String getFromEmail() { 
    return fromEmail; 
} 
public void setFromEmail(String fromEmail) { 
    this.fromEmail = fromEmail; 
} 
public String getToEmails() { 
    return toEmails; 
} 
public void setToEmails(String toEmails) { 
    this.toEmails = toEmails; 
} 
public String getUsername() { 
    return username; 
} 
public void setUsername(String username) { 
    this.username = username; 
} 
public String getPassword() { 
    return password; 
} 
public void setPassword(String password) { 
    this.password = password; 
} 
public String getSubject() { 
    return subject; 
} 
public void setSubject(String subject) { 
    this.subject = subject; 
} 
public String getMessage() { 
    return message; 
} 
public void setMessage(String message) { 
    this.message = message; 
} 
public String getCcList() { 
    return ccList; 
} 
public void setCcList(String ccList) { 
    this.ccList = ccList; 
} 
public String getBccList() { 
    return bccList; 
} 
public void setBccList(String bccList) { 
    this.bccList = bccList; 
} 



public String getFile() { 
    return file; 
} 
public void setFile(String file) { 
    debug("filename: " + file); 
    this.file = file; 
} 
public void generateEmail() { 
    Properties props = new Properties(); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.port", this.getSmtpPort()); 
    if(isSslOn()) { 
     props.put("mail.smtp.socketFactory.port", this.getSmtpPort()); 
     props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    } 
    props.put("mail.smtp.host", getServerAddr()); 

    Session session = Session.getDefaultInstance(props, new Authenticator() { 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(getUsername(), getPassword()); 
     } 
    }); 


    Message msg = new MimeMessage(session); 
    try { 
     msg.setFrom(new InternetAddress(this.getFromEmail())); 
     if (getToEmails() != null) { 
      msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(getToEmails())); 
     } else if (isBccMode()) { 
      msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(getFromEmail())); 
     } 

     //msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(getCcList())); 
     msg.setSubject(getSubject()); 
     //msg.setText(getMessage()); 
     MimeBodyPart messagePart = new MimeBodyPart(); 
     messagePart.setText(getMessage()); 

     /* 
     MimeBodyPart attachments = new MimeBodyPart(); 
     FileDataSource fd = new FileDataSource(getFile()); 
     attachments.setDataHandler(new DataHandler(fd)); 
     attachments.setFileName(fd.getName()); 
     */ 

     Multipart mp = new MimeMultipart(); 
     mp.addBodyPart(messagePart); 
     //mp.addBodyPart(attachments); 

     msg.setContent(mp); 
     Transport.send(msg); 
     debug("Done. Closing Session..."); 

    } catch (AddressException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (MessagingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

private static void debug(String message) { 
    System.out.println("[DEBUG]: " + message); 
} 

回答

1

我看到你的解析代碼沒有明顯的問題。我希望它在嘗試解析generateEmail()方法時失敗。由於解析器遵循順序方法,所以debug()方法也沒有得到解析。嘗試將public boolean visit(MethodDeclaration method)中的語句放在try-catch塊中,並且可能帶有Throwable子句。

還有一個檢查你的readFile()方法。讀取文件時最常見的一個問題是缺少將新行字符追加到每行。不添加新行會導致錯誤地構建代碼,特別是在代碼中有註釋的時候。您可以檢查compilationUnit.getProblems()方法來檢查任何此類問題。

0

@UnniKris - 謝謝你的迴應。在將新行寫入StringBuilder之後,我更改了readFile()方法幷包含\n。這工作。我所有的方法都被成功解析了。

我對READFILE()方法的代碼片段張貼在這裏:

public static String readFile(File file) { 
    StringBuilder sb = new StringBuilder(); 
    try { 
     Scanner scan = new Scanner(file); 

     while(scan.hasNext()) { 
      sb.append(scan.nextLine()+"\n"); //added the new line feed here 
     } 
     scan.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    String fullcode = sb.toString(); 
    //debug("full.code", fullcode); 
    return fullcode; 

} 
+0

高興它的工作... –