Committed by
Gerrit Code Review
Invalid pattern restriction check
Change-Id: I5398cb6e85f06efd7937562ba0d9a51eff23572d (cherry picked from commit 8d0ad2fa)
Showing
3 changed files
with
55 additions
and
11 deletions
| ... | @@ -16,6 +16,8 @@ | ... | @@ -16,6 +16,8 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.parser.impl.listeners; | 17 | package org.onosproject.yangutils.parser.impl.listeners; |
| 18 | 18 | ||
| 19 | +import java.util.regex.Pattern; | ||
| 20 | +import java.util.regex.PatternSyntaxException; | ||
| 19 | import org.onosproject.yangutils.datamodel.YangDataTypes; | 21 | import org.onosproject.yangutils.datamodel.YangDataTypes; |
| 20 | import org.onosproject.yangutils.datamodel.YangDerivedInfo; | 22 | import org.onosproject.yangutils.datamodel.YangDerivedInfo; |
| 21 | import org.onosproject.yangutils.datamodel.YangPatternRestriction; | 23 | import org.onosproject.yangutils.datamodel.YangPatternRestriction; |
| ... | @@ -98,8 +100,8 @@ public final class PatternRestrictionListener { | ... | @@ -98,8 +100,8 @@ public final class PatternRestrictionListener { |
| 98 | * Sets the pattern restriction to type. | 100 | * Sets the pattern restriction to type. |
| 99 | * | 101 | * |
| 100 | * @param listener listener's object | 102 | * @param listener listener's object |
| 101 | - * @param type Yang type for which pattern restriction to be set | 103 | + * @param type Yang type for which pattern restriction to be set |
| 102 | - * @param ctx context object of the grammar rule | 104 | + * @param ctx context object of the grammar rule |
| 103 | */ | 105 | */ |
| 104 | private static void setPatternRestriction(TreeWalkListener listener, YangType type, | 106 | private static void setPatternRestriction(TreeWalkListener listener, YangType type, |
| 105 | GeneratedYangParser.PatternStatementContext ctx) { | 107 | GeneratedYangParser.PatternStatementContext ctx) { |
| ... | @@ -114,7 +116,8 @@ public final class PatternRestrictionListener { | ... | @@ -114,7 +116,8 @@ public final class PatternRestrictionListener { |
| 114 | throw parserException; | 116 | throw parserException; |
| 115 | } | 117 | } |
| 116 | 118 | ||
| 117 | - String patternArgument = ctx.string().getText().replace("\"", EMPTY_STRING); | 119 | + // Validate and get valid pattern restriction string. |
| 120 | + String patternArgument = getValidPattern(ctx); | ||
| 118 | 121 | ||
| 119 | if (type.getDataType() == YangDataTypes.STRING) { | 122 | if (type.getDataType() == YangDataTypes.STRING) { |
| 120 | YangStringRestriction stringRestriction = (YangStringRestriction) type.getDataTypeExtendedInfo(); | 123 | YangStringRestriction stringRestriction = (YangStringRestriction) type.getDataTypeExtendedInfo(); |
| ... | @@ -145,10 +148,10 @@ public final class PatternRestrictionListener { | ... | @@ -145,10 +148,10 @@ public final class PatternRestrictionListener { |
| 145 | * It is called when parser exits from grammar rule (pattern). | 148 | * It is called when parser exits from grammar rule (pattern). |
| 146 | * | 149 | * |
| 147 | * @param listener listener's object | 150 | * @param listener listener's object |
| 148 | - * @param ctx context object of the grammar rule | 151 | + * @param ctx context object of the grammar rule |
| 149 | */ | 152 | */ |
| 150 | public static void processPatternRestrictionExit(TreeWalkListener listener, | 153 | public static void processPatternRestrictionExit(TreeWalkListener listener, |
| 151 | - GeneratedYangParser.PatternStatementContext ctx) { | 154 | + GeneratedYangParser.PatternStatementContext ctx) { |
| 152 | 155 | ||
| 153 | // Check for stack to be non empty. | 156 | // Check for stack to be non empty. |
| 154 | checkStackIsNotEmpty(listener, MISSING_HOLDER, PATTERN_DATA, ctx.string().getText(), EXIT); | 157 | checkStackIsNotEmpty(listener, MISSING_HOLDER, PATTERN_DATA, ctx.string().getText(), EXIT); |
| ... | @@ -164,4 +167,25 @@ public final class PatternRestrictionListener { | ... | @@ -164,4 +167,25 @@ public final class PatternRestrictionListener { |
| 164 | ctx.string().getText(), EXIT)); | 167 | ctx.string().getText(), EXIT)); |
| 165 | } | 168 | } |
| 166 | } | 169 | } |
| 170 | + | ||
| 171 | + /** | ||
| 172 | + * Validates and return the valid pattern. | ||
| 173 | + * | ||
| 174 | + * @param ctx context object of the grammar rule | ||
| 175 | + * @return validated string | ||
| 176 | + */ | ||
| 177 | + private static String getValidPattern(GeneratedYangParser.PatternStatementContext ctx) { | ||
| 178 | + String userInputPattern = ctx.string().getText().replace("\"", EMPTY_STRING); | ||
| 179 | + try { | ||
| 180 | + Pattern.compile(userInputPattern); | ||
| 181 | + } catch (PatternSyntaxException exception) { | ||
| 182 | + ParserException parserException = new ParserException("YANG file error : " + | ||
| 183 | + YangConstructType.getYangConstructType(PATTERN_DATA) + " name " + ctx.string().getText() + | ||
| 184 | + " is not a valid regular expression"); | ||
| 185 | + parserException.setLine(ctx.getStart().getLine()); | ||
| 186 | + parserException.setCharPosition(ctx.getStart().getCharPositionInLine()); | ||
| 187 | + throw parserException; | ||
| 188 | + } | ||
| 189 | + return userInputPattern; | ||
| 190 | + } | ||
| 167 | } | 191 | } | ... | ... |
| ... | @@ -18,17 +18,16 @@ package org.onosproject.yangutils.parser.impl.listeners; | ... | @@ -18,17 +18,16 @@ package org.onosproject.yangutils.parser.impl.listeners; |
| 18 | 18 | ||
| 19 | import java.io.IOException; | 19 | import java.io.IOException; |
| 20 | import java.util.ListIterator; | 20 | import java.util.ListIterator; |
| 21 | - | ||
| 22 | import org.junit.Test; | 21 | import org.junit.Test; |
| 23 | -import org.onosproject.yangutils.datamodel.YangNode; | 22 | +import org.onosproject.yangutils.datamodel.YangDataTypes; |
| 24 | -import org.onosproject.yangutils.datamodel.YangNodeType; | ||
| 25 | -import org.onosproject.yangutils.datamodel.YangModule; | ||
| 26 | import org.onosproject.yangutils.datamodel.YangLeaf; | 23 | import org.onosproject.yangutils.datamodel.YangLeaf; |
| 27 | import org.onosproject.yangutils.datamodel.YangLeafList; | 24 | import org.onosproject.yangutils.datamodel.YangLeafList; |
| 28 | -import org.onosproject.yangutils.datamodel.YangDataTypes; | 25 | +import org.onosproject.yangutils.datamodel.YangModule; |
| 29 | -import org.onosproject.yangutils.datamodel.YangTypeDef; | 26 | +import org.onosproject.yangutils.datamodel.YangNode; |
| 27 | +import org.onosproject.yangutils.datamodel.YangNodeType; | ||
| 30 | import org.onosproject.yangutils.datamodel.YangPatternRestriction; | 28 | import org.onosproject.yangutils.datamodel.YangPatternRestriction; |
| 31 | import org.onosproject.yangutils.datamodel.YangStringRestriction; | 29 | import org.onosproject.yangutils.datamodel.YangStringRestriction; |
| 30 | +import org.onosproject.yangutils.datamodel.YangTypeDef; | ||
| 32 | import org.onosproject.yangutils.parser.exceptions.ParserException; | 31 | import org.onosproject.yangutils.parser.exceptions.ParserException; |
| 33 | import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; | 32 | import org.onosproject.yangutils.parser.impl.YangUtilsParserManager; |
| 34 | 33 | ||
| ... | @@ -194,4 +193,12 @@ public class PatternRestrictionListenerTest { | ... | @@ -194,4 +193,12 @@ public class PatternRestrictionListenerTest { |
| 194 | .getPatternList().listIterator(); | 193 | .getPatternList().listIterator(); |
| 195 | assertThat(patternListIterator.next(), is("[a-zA-Z]")); | 194 | assertThat(patternListIterator.next(), is("[a-zA-Z]")); |
| 196 | } | 195 | } |
| 196 | + | ||
| 197 | + /** | ||
| 198 | + * Checks invalid pattern sub-statement. | ||
| 199 | + */ | ||
| 200 | + @Test(expected = ParserException.class) | ||
| 201 | + public void processInvalidPatternSubStatements() throws IOException, ParserException { | ||
| 202 | + YangNode node = manager.getDataModel("src/test/resources/InvalidPatternSubStatements.yang"); | ||
| 203 | + } | ||
| 197 | } | 204 | } | ... | ... |
-
Please register or login to post a comment