Class JavadocMetadataScraper
- java.lang.Object
-
- com.puppycrawl.tools.checkstyle.api.AutomaticBean
-
- com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter
-
- com.puppycrawl.tools.checkstyle.api.AbstractCheck
-
- com.puppycrawl.tools.checkstyle.checks.javadoc.AbstractJavadocCheck
-
- com.puppycrawl.tools.checkstyle.meta.JavadocMetadataScraper
-
- All Implemented Interfaces:
Configurable,Contextualizable
public class JavadocMetadataScraper extends AbstractJavadocCheck
Class for scraping module metadata from the corresponding class' class-level javadoc.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class com.puppycrawl.tools.checkstyle.api.AutomaticBean
AutomaticBean.OutputStreamOptions
-
-
Field Summary
Fields Modifier and Type Field Description private static java.util.regex.PatternDEFAULT_VALUE_TAGRegular expression for property default value location in class-level javadocs.private static java.util.regex.PatternDESC_CLEANRegular expression for removal of @code{-} present at the beginning of texts.private static java.util.regex.PatternEXAMPLES_TAGRegular expression for check example location in class-level javadocs.private intexampleSectionStartIdxChild number of the example section node, where parent is the class level javadoc root node.private static java.util.regex.PatternFILE_SEPARATOR_PATTERNRegular expression for file separator corresponding to the host OS.private static java.lang.StringJAVA_FILE_EXTENSIONJava file extension.private static java.util.Map<java.lang.String,ModuleDetails>MODULE_DETAILS_STOREModule details store used for testing.private ModuleDetailsmoduleDetailsModuleDetails instance for each module AST traversal.static java.lang.StringMSG_DESC_MISSINGA key is pointing to the warning message text in "messages.properties" file.private static java.util.regex.PatternPARENT_TAGRegular expression for module parent location in class-level javadocs.private intparentSectionStartIdxChild number of the parent section node, where parent is the class level javadoc root node.private static java.lang.StringPROP_DEFAULT_VALUE_MISSINGFormat for exception message for missing default value for check property.private static java.lang.StringPROP_TYPE_MISSINGFormat for exception message for missing type for check property.private static java.util.Set<java.lang.String>PROPERTIES_TO_NOT_WRITEThis set contains faulty property default value which should not be written to the XML metadata files.private static java.util.regex.PatternPROPERTY_TAGRegular expression for property location in class-level javadocs.private intpropertySectionStartIdxChild number of the property section node, where parent is the class level javadoc root node.private static java.util.regex.PatternQUOTE_PATTERNRegular expression for quotes.private DetailNoderootNodeDetailNode pointing to the root node of the class level javadoc of the class.private booleanscrapingViolationMessageListBoolean variable which lets us know whether violation message section is being scraped currently.private static java.util.regex.PatternTOKEN_TEXT_PATTERNRegular expression for detecting ANTLR tokens(for e.g.private booleantoScanBoolean variable which lets us know whether we should scan and scrape the current javadoc or not.private static java.util.regex.PatternTYPE_TAGRegular expression for property type location in class-level javadocs.private static java.util.regex.PatternVALIDATION_TYPE_TAGRegular expression for property validation type location in class-level javadocs.private static java.util.regex.PatternVIOLATION_MESSAGES_TAGRegular expression for module violation messages location in class-level javadocs.private booleanwriteXmlOutputControl whether to write XML output or not.-
Fields inherited from class com.puppycrawl.tools.checkstyle.checks.javadoc.AbstractJavadocCheck
MSG_JAVADOC_MISSED_HTML_CLOSE, MSG_JAVADOC_PARSE_RULE_ERROR, MSG_JAVADOC_WRONG_SINGLETON_TAG
-
-
Constructor Summary
Constructors Constructor Description JavadocMetadataScraper()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidbeginJavadocTree(DetailNode rootAst)Called before the starting to process a tree.private static java.lang.StringcleanDefaultTokensText(java.lang.String initialText)Clean up the default token text by removing hyperlinks, and only keeping token type text.private static java.lang.StringconstructSubTreeText(DetailNode node, int childLeftLimit, int childRightLimit)Performs a DFS of the subtree with a node as the root and constructs the text of that tree, ignoring JavadocToken texts.private static ModulePropertyDetailscreateProperties(DetailNode nodeLi)Create the modulePropertyDetails content.voidfinishJavadocTree(DetailNode rootAst)Called after finished processing a tree.int[]getDefaultJavadocTokens()Returns the default javadoc token types a check is interested in.private java.lang.StringgetDescriptionText()Create the description text with starting index as 0 and ending index would be the first valid non zero index amongst in the order ofpropertySectionStartIdx,exampleSectionStartIdxandparentSectionStartIdx.private static java.util.Optional<DetailNode>getFirstChildOfMatchingText(DetailNode node, java.util.regex.Pattern pattern)Get first child of parent node matching the provided pattern.private static java.util.Optional<DetailNode>getFirstChildOfType(DetailNode node, int tokenType, int offset)Returns the first child node which matches the providedTokenTypeand has the children index after the offset value.static java.util.Map<java.lang.String,ModuleDetails>getModuleDetailsStore()Getter method formoduleDetailsStore.private java.lang.StringgetModuleSimpleName()Extract simple file name from the whole file path name.private ModuleTypegetModuleType()Get module type(check/filter/filefilter) based on file name.private static java.lang.StringgetPackageName(java.lang.String filePath)Retrieve package name of module from the absolute file path.private static DetailASTgetParent(DetailAST commentBlock)Returns parent node, removing modifier/annotation nodes.private static intgetParentIndexOf(DetailNode node)Traverse parents until we reach the root node (@code{JavadocTokenTypes.JAVADOC}) child and return its index.private static java.lang.StringgetParentText(DetailNode nodeParagraph)Get module parent text from paragraph javadoc node.private static java.lang.StringgetPropertyDefaultText(DetailNode nodeLi, DetailNode defaultValueNode)Create property default text, which is either normal property value or list of tokens.int[]getRequiredJavadocTokens()The javadoc tokens that this check must be registered for.private static java.lang.StringgetTagTextFromProperty(DetailNode nodeLi, DetailNode propertyMeta)Get tag text from property data.private static java.lang.StringgetText(DetailNode parentNode)Get joined text from all text children nodes.private static java.lang.StringgetTextFromTag(DetailNode nodeTag)Get text fromJavadocTokenTypes.JAVADOC_INLINE_TAG.private static java.lang.StringgetViolationMessages(DetailNode nodeLi)Get the violation message text for a specific key from the list item.private static booleanisChildNodeTextMatches(DetailNode ast, java.util.regex.Pattern pattern)Checks whether the first childJavadocTokenType.TEXTnode matches given pattern.private static booleanisExamplesText(DetailNode ast)Checks whether the paragraph node corresponds to the example section.private static booleanisParentText(DetailNode nodeParagraph)Checks whether theJavadocTokenType.PARAGRAPHnode is referring to the parent javadoc segment.private static booleanisPropertyList(DetailNode nodeLi)Checks whether the list item node is part of a property list.private booleanisTopLevelClassJavadoc()Check if the current javadoc block comment AST corresponds to the top-level class as we only want to scrape top-level class javadoc.private static booleanisViolationMessagesText(DetailNode nodeParagraph)Checks whether theJavadocTokenType.PARAGRAPHnode is referring to the violation message keys javadoc segment.static voidresetModuleDetailsStore()Reset the module detail store of any previous information.private voidscrapeContent(DetailNode ast)Method containing the core logic of scraping.voidsetWriteXmlOutput(boolean writeXmlOutput)Setter to control whether to write XML output or not.voidvisitJavadocToken(DetailNode ast)Called to process a Javadoc token.-
Methods inherited from class com.puppycrawl.tools.checkstyle.checks.javadoc.AbstractJavadocCheck
acceptJavadocWithNonTightHtml, beginTree, destroy, finishTree, getAcceptableJavadocTokens, getAcceptableTokens, getBlockCommentAst, getDefaultTokens, getRequiredTokens, init, isCommentNodesRequired, leaveJavadocToken, setJavadocTokens, setViolateExecutionOnNonTightHtml, visitToken
-
Methods inherited from class com.puppycrawl.tools.checkstyle.api.AbstractCheck
clearViolations, getFileContents, getLine, getLineCodePoints, getLines, getTabWidth, getTokenNames, getViolations, leaveToken, log, log, log, setFileContents, setTabWidth, setTokens
-
Methods inherited from class com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter
finishLocalSetup, getCustomMessages, getId, getMessageBundle, getSeverity, getSeverityLevel, setId, setSeverity
-
Methods inherited from class com.puppycrawl.tools.checkstyle.api.AutomaticBean
configure, contextualize, getConfiguration, setupChild
-
-
-
-
Field Detail
-
MSG_DESC_MISSING
public static final java.lang.String MSG_DESC_MISSING
A key is pointing to the warning message text in "messages.properties" file.- See Also:
- Constant Field Values
-
MODULE_DETAILS_STORE
private static final java.util.Map<java.lang.String,ModuleDetails> MODULE_DETAILS_STORE
Module details store used for testing.
-
PROPERTY_TAG
private static final java.util.regex.Pattern PROPERTY_TAG
Regular expression for property location in class-level javadocs.
-
TYPE_TAG
private static final java.util.regex.Pattern TYPE_TAG
Regular expression for property type location in class-level javadocs.
-
VALIDATION_TYPE_TAG
private static final java.util.regex.Pattern VALIDATION_TYPE_TAG
Regular expression for property validation type location in class-level javadocs.
-
DEFAULT_VALUE_TAG
private static final java.util.regex.Pattern DEFAULT_VALUE_TAG
Regular expression for property default value location in class-level javadocs.
-
EXAMPLES_TAG
private static final java.util.regex.Pattern EXAMPLES_TAG
Regular expression for check example location in class-level javadocs.
-
PARENT_TAG
private static final java.util.regex.Pattern PARENT_TAG
Regular expression for module parent location in class-level javadocs.
-
VIOLATION_MESSAGES_TAG
private static final java.util.regex.Pattern VIOLATION_MESSAGES_TAG
Regular expression for module violation messages location in class-level javadocs.
-
TOKEN_TEXT_PATTERN
private static final java.util.regex.Pattern TOKEN_TEXT_PATTERN
Regular expression for detecting ANTLR tokens(for e.g. CLASS_DEF).
-
DESC_CLEAN
private static final java.util.regex.Pattern DESC_CLEAN
Regular expression for removal of @code{-} present at the beginning of texts.
-
FILE_SEPARATOR_PATTERN
private static final java.util.regex.Pattern FILE_SEPARATOR_PATTERN
Regular expression for file separator corresponding to the host OS.
-
QUOTE_PATTERN
private static final java.util.regex.Pattern QUOTE_PATTERN
Regular expression for quotes.
-
JAVA_FILE_EXTENSION
private static final java.lang.String JAVA_FILE_EXTENSION
Java file extension.- See Also:
- Constant Field Values
-
PROPERTIES_TO_NOT_WRITE
private static final java.util.Set<java.lang.String> PROPERTIES_TO_NOT_WRITE
This set contains faulty property default value which should not be written to the XML metadata files.
-
PROP_TYPE_MISSING
private static final java.lang.String PROP_TYPE_MISSING
Format for exception message for missing type for check property.- See Also:
- Constant Field Values
-
PROP_DEFAULT_VALUE_MISSING
private static final java.lang.String PROP_DEFAULT_VALUE_MISSING
Format for exception message for missing default value for check property.- See Also:
- Constant Field Values
-
moduleDetails
private ModuleDetails moduleDetails
ModuleDetails instance for each module AST traversal.
-
scrapingViolationMessageList
private boolean scrapingViolationMessageList
Boolean variable which lets us know whether violation message section is being scraped currently.
-
toScan
private boolean toScan
Boolean variable which lets us know whether we should scan and scrape the current javadoc or not. Since we need only class level javadoc, it becomes true at its root and false after encounteringJavadocTokenTypes.SINCE_LITERAL.
-
rootNode
private DetailNode rootNode
DetailNode pointing to the root node of the class level javadoc of the class.
-
propertySectionStartIdx
private int propertySectionStartIdx
Child number of the property section node, where parent is the class level javadoc root node.
-
exampleSectionStartIdx
private int exampleSectionStartIdx
Child number of the example section node, where parent is the class level javadoc root node.
-
parentSectionStartIdx
private int parentSectionStartIdx
Child number of the parent section node, where parent is the class level javadoc root node.
-
writeXmlOutput
private boolean writeXmlOutput
Control whether to write XML output or not.
-
-
Constructor Detail
-
JavadocMetadataScraper
public JavadocMetadataScraper()
-
-
Method Detail
-
setWriteXmlOutput
public final void setWriteXmlOutput(boolean writeXmlOutput)
Setter to control whether to write XML output or not.- Parameters:
writeXmlOutput- whether to write XML output or not.
-
getDefaultJavadocTokens
public int[] getDefaultJavadocTokens()
Description copied from class:AbstractJavadocCheckReturns the default javadoc token types a check is interested in.- Specified by:
getDefaultJavadocTokensin classAbstractJavadocCheck- Returns:
- the default javadoc token types
- See Also:
JavadocTokenTypes
-
getRequiredJavadocTokens
public int[] getRequiredJavadocTokens()
Description copied from class:AbstractJavadocCheckThe javadoc tokens that this check must be registered for.- Overrides:
getRequiredJavadocTokensin classAbstractJavadocCheck- Returns:
- the javadoc token set this must be registered for.
- See Also:
JavadocTokenTypes
-
beginJavadocTree
public void beginJavadocTree(DetailNode rootAst)
Description copied from class:AbstractJavadocCheckCalled before the starting to process a tree.- Overrides:
beginJavadocTreein classAbstractJavadocCheck- Parameters:
rootAst- the root of the tree
-
visitJavadocToken
public void visitJavadocToken(DetailNode ast)
Description copied from class:AbstractJavadocCheckCalled to process a Javadoc token.- Specified by:
visitJavadocTokenin classAbstractJavadocCheck- Parameters:
ast- the token to process
-
finishJavadocTree
public void finishJavadocTree(DetailNode rootAst)
Description copied from class:AbstractJavadocCheckCalled after finished processing a tree.- Overrides:
finishJavadocTreein classAbstractJavadocCheck- Parameters:
rootAst- the root of the tree
-
scrapeContent
private void scrapeContent(DetailNode ast)
Method containing the core logic of scraping. This keeps track and decides which phase of scraping we are in, and accordingly call other subroutines.- Parameters:
ast- javadoc ast
-
createProperties
private static ModulePropertyDetails createProperties(DetailNode nodeLi)
Create the modulePropertyDetails content.- Parameters:
nodeLi- list item javadoc node- Returns:
- modulePropertyDetail object for the corresponding property
-
getTagTextFromProperty
private static java.lang.String getTagTextFromProperty(DetailNode nodeLi, DetailNode propertyMeta)
Get tag text from property data.- Parameters:
nodeLi- javadoc li item nodepropertyMeta- property javadoc node- Returns:
- property metadata text
-
cleanDefaultTokensText
private static java.lang.String cleanDefaultTokensText(java.lang.String initialText)
Clean up the default token text by removing hyperlinks, and only keeping token type text.- Parameters:
initialText- unclean text- Returns:
- clean text
-
constructSubTreeText
private static java.lang.String constructSubTreeText(DetailNode node, int childLeftLimit, int childRightLimit)
Performs a DFS of the subtree with a node as the root and constructs the text of that tree, ignoring JavadocToken texts.- Parameters:
node- root node of subtreechildLeftLimit- the left index of root children from where to scanchildRightLimit- the right index of root children till where to scan- Returns:
- constructed text of subtree
-
getDescriptionText
private java.lang.String getDescriptionText()
Create the description text with starting index as 0 and ending index would be the first valid non zero index amongst in the order ofpropertySectionStartIdx,exampleSectionStartIdxandparentSectionStartIdx.- Returns:
- description text
-
getPropertyDefaultText
private static java.lang.String getPropertyDefaultText(DetailNode nodeLi, DetailNode defaultValueNode)
Create property default text, which is either normal property value or list of tokens.- Parameters:
nodeLi- list item javadoc nodedefaultValueNode- default value node- Returns:
- default property text
-
getViolationMessages
private static java.lang.String getViolationMessages(DetailNode nodeLi)
Get the violation message text for a specific key from the list item.- Parameters:
nodeLi- list item javadoc node- Returns:
- violation message key text
-
getTextFromTag
private static java.lang.String getTextFromTag(DetailNode nodeTag)
Get text fromJavadocTokenTypes.JAVADOC_INLINE_TAG.- Parameters:
nodeTag- target javadoc tag- Returns:
- text contained by the tag
-
getFirstChildOfType
private static java.util.Optional<DetailNode> getFirstChildOfType(DetailNode node, int tokenType, int offset)
Returns the first child node which matches the providedTokenTypeand has the children index after the offset value.- Parameters:
node- parent nodetokenType- token type to matchoffset- children array index offset- Returns:
- the first child satisfying the conditions
-
getText
private static java.lang.String getText(DetailNode parentNode)
Get joined text from all text children nodes.- Parameters:
parentNode- parent node- Returns:
- the joined text of node
-
getFirstChildOfMatchingText
private static java.util.Optional<DetailNode> getFirstChildOfMatchingText(DetailNode node, java.util.regex.Pattern pattern)
Get first child of parent node matching the provided pattern.- Parameters:
node- parent nodepattern- pattern to match against- Returns:
- the first child node matching the condition
-
getParent
private static DetailAST getParent(DetailAST commentBlock)
Returns parent node, removing modifier/annotation nodes.- Parameters:
commentBlock- child node.- Returns:
- parent node.
-
getParentIndexOf
private static int getParentIndexOf(DetailNode node)
Traverse parents until we reach the root node (@code{JavadocTokenTypes.JAVADOC}) child and return its index.- Parameters:
node- subtree child node- Returns:
- root node child index
-
getParentText
private static java.lang.String getParentText(DetailNode nodeParagraph)
Get module parent text from paragraph javadoc node.- Parameters:
nodeParagraph- paragraph javadoc node- Returns:
- parent text
-
getModuleType
private ModuleType getModuleType()
Get module type(check/filter/filefilter) based on file name.- Returns:
- module type
-
getModuleSimpleName
private java.lang.String getModuleSimpleName()
Extract simple file name from the whole file path name.- Returns:
- simple module name
-
getPackageName
private static java.lang.String getPackageName(java.lang.String filePath)
Retrieve package name of module from the absolute file path.- Parameters:
filePath- absolute file path- Returns:
- package name
-
getModuleDetailsStore
public static java.util.Map<java.lang.String,ModuleDetails> getModuleDetailsStore()
Getter method formoduleDetailsStore.- Returns:
- map containing module details of supplied checks.
-
resetModuleDetailsStore
public static void resetModuleDetailsStore()
Reset the module detail store of any previous information.
-
isTopLevelClassJavadoc
private boolean isTopLevelClassJavadoc()
Check if the current javadoc block comment AST corresponds to the top-level class as we only want to scrape top-level class javadoc.- Returns:
- true if the current AST corresponds to top level class
-
isExamplesText
private static boolean isExamplesText(DetailNode ast)
Checks whether the paragraph node corresponds to the example section.- Parameters:
ast- javadoc paragraph node- Returns:
- true if the section matches the example section marker
-
isPropertyList
private static boolean isPropertyList(DetailNode nodeLi)
Checks whether the list item node is part of a property list.- Parameters:
nodeLi-JavadocTokenType.LInode- Returns:
- true if the node is part of a property list
-
isViolationMessagesText
private static boolean isViolationMessagesText(DetailNode nodeParagraph)
Checks whether theJavadocTokenType.PARAGRAPHnode is referring to the violation message keys javadoc segment.- Parameters:
nodeParagraph- paragraph javadoc node- Returns:
- true if paragraph node contains the violation message keys text
-
isParentText
private static boolean isParentText(DetailNode nodeParagraph)
Checks whether theJavadocTokenType.PARAGRAPHnode is referring to the parent javadoc segment.- Parameters:
nodeParagraph- paragraph javadoc node- Returns:
- true if paragraph node contains the parent text
-
isChildNodeTextMatches
private static boolean isChildNodeTextMatches(DetailNode ast, java.util.regex.Pattern pattern)
Checks whether the first childJavadocTokenType.TEXTnode matches given pattern.- Parameters:
ast- parent javadoc nodepattern- pattern to match- Returns:
- true if one of child text nodes matches pattern
-
-