2015-02-06 6 views
11

Desidero personalizzare la regola di Checkstyle JavadocVariable, in modo che non si possa lamentare di un campo che ha un'annotazione @FindBy.Come rendere Checkstyle ignorato JavaDoc mancante ogni volta che c'è un'annotazione specifica

class Demo{ 

    @FindBy(id = "new-button") 
    public WebElement createButton; //<- no JavaDoc required because it is a field "injected" by selenium 

    public String otherField; //<- complain about missing Java doc 
} 

Ma io non ho la minima idea di come specificare questo nel file checkstyle.xml. Qualcuno ha un'idea?

cose che non funzionano in questo caso d'uso:

  • Modificazione della classe controllato è anche nessuna soluzione!
  • SuppressWithNearbyCommentFilternon funziona, perché è una di annotazione, ma non un commento

risposta

10

Conosco diverse soluzioni, ma tutti loro richiede un lavoro supplementare da fare.

  1. Implementazione propria JavadocVariableCheck con possibilità di saltare l'annotazione del caso di archiviazione.
  2. Attuazione filtro checkstyle (come SuppressWarningsHolder + SuppressWarningsFilter ma con supporto annotazione)
  3. Oppure attuare semplice filtro che analizza per @FindBy e ignora due linee dopo.

La mia soluzione (la più semplice):

package org.aap.checks; 

import com.google.common.collect.Lists; 
import com.puppycrawl.tools.checkstyle.api.AuditEvent; 
import com.puppycrawl.tools.checkstyle.api.AutomaticBean; 
import com.puppycrawl.tools.checkstyle.api.FileContents; 
import com.puppycrawl.tools.checkstyle.api.Filter; 
import com.puppycrawl.tools.checkstyle.checks.FileContentsHolder; 

import java.lang.ref.WeakReference; 
import java.util.Collections; 
import java.util.Iterator; 
import java.util.List; 

public class SuppressWithAnnotationFilter 
     extends AutomaticBean 
     implements Filter { 

    public class Tag implements Comparable<Tag> { 
     private final int firstLine; 
     private final int lastLine; 

     public Tag(int firstLine, int lastLine) { 
      this.firstLine = firstLine; 
      this.lastLine = lastLine; 
     } 

     @Override 
     public int compareTo(Tag other) { 
      if (firstLine == other.firstLine) { 
       return lastLine - other.lastLine; 
      } 
      return (firstLine - other.firstLine); 
     } 

     public boolean isMatch(AuditEvent event) { 
      final int line = event.getLine(); 
      return line >= firstLine && line <= lastLine; 
     } 

     @Override 
     public final String toString() { 
      return "Tag[lines=" + firstLine + " to " + lastLine + "]"; 
     } 
    } 

    private final List<Tag> tags = Lists.newArrayList(); 
    private WeakReference<FileContents> fileContentsReference = 
      new WeakReference<FileContents>(null); 

    public FileContents getFileContents() { 
     return fileContentsReference.get(); 
    } 

    public void setFileContents(FileContents fileContents) { 
     fileContentsReference = new WeakReference<FileContents>(fileContents); 
    } 

    @Override 
    public boolean accept(AuditEvent event) { 
     if (event.getLocalizedMessage() == null) { 
      return true;  // A special event. 
     } 

     final FileContents currentContents = FileContentsHolder.getContents(); 
     if (currentContents == null) { 
      return true; 
     } 
     if (getFileContents() != currentContents) { 
      setFileContents(currentContents); 
      tagSuppressions(); 
     } 
     for (final Iterator<Tag> iter = tags.iterator(); iter.hasNext();) { 
      final Tag tag = iter.next(); 
      if (tag.isMatch(event)) { 
       return false; 
      } 
     } 
     return true; 
    } 

    private void tagSuppressions() { 
     tags.clear(); 
     final FileContents contents = getFileContents(); 

     String[] contentsLines = contents.getLines(); 
     for (int i = 0; i < contentsLines.length; i++) { 
      if (contentsLines[i].contains("@FindBy")) { 
       tags.add(new Tag(i+1, i+2)); 
      } 
     } 

     Collections.sort(tags); 
    } 
} 

Add risultante classe in classpath del compito checkstyle poi nel checkstyle.xml specificare filtro:

<?xml version="1.0"?> 
<!DOCTYPE module PUBLIC 
    "-//Puppy Crawl//DTD Check Configuration 1.3//EN" 
    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> 
<module name="Checker"> 
    <module name="TreeWalker"> 
    .... 
    <!-- your Check goes here --> 
    <module name="org.aap.checks.SuppressWithAnnotationFilter"/> 
    .... 
    </module> 
</module> 
Problemi correlati